簡體   English   中英

C ++ OpenGL重復

[英]c++ opengl repeat

我嘗試繪制圖片的一部分,但是重復了圖片的一部分,它拉伸了圖片,看起來很難看。

我如何重復圖片而不是拉伸圖片。

代碼的相關部分:

glEnable (GL_BLEND);
glColor4f(1.0f,1.0f,1.0f,1.0f);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glColor3f(1.f, 1.f, 1.f);
glBindTexture(GL_TEXTURE_2D, texture[image]);
int repeat = (x2-x)/73;
glBegin(GL_QUADS); //create polygon
glTexCoord2f((part/3.f), 0.0f);glVertex2d(x, y);
glTexCoord2f(((part+1.f)/3.f)+repeat, 0.0f);glVertex2d(x2, y);
glTexCoord2f(((part+1.f)/3.f)+repeat, 1.0f);glVertex2d(x2, y2);
glTexCoord2f((part/3.f), 1.0f);glVertex2d(x, y2);
glEnd();

以及紋理的負載:

texture[fNum] = SOIL_load_OGL_texture
            (
            fName.c_str(),
            SOIL_LOAD_AUTO,
            SOIL_CREATE_NEW_ID,
            SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y 
            );
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

這是您幫助后的固定代碼,但是現在還有另一個問題,我只想重復圖像的特定部分。 非常感謝!

固定:現在我制作了自己的代碼以重復該步驟,並且可以正常工作:

float nx=x, nx2 = x+length;
float ny2 = y2+25.f;
if((x2-x)/length > 1)
{
    while(nx2 < x2)
    {
        if(nx2+length < x2)
        {
            glBegin(GL_QUADS); //create polygon
            glTexCoord2f((part/3.f), 0.0f);glVertex2d(nx, y);
            glTexCoord2f(((part+1.f)/3.f), 0.0f);glVertex2d(nx2, y);
            glTexCoord2f(((part+1.f)/3.f), 1.0f);glVertex2d(nx2, ny2);
            glTexCoord2f((part/3.f), 1.0f);glVertex2d(nx, ny2);
            glEnd();
            nx = nx2;
            nx2 += length;
        }
        else
        {
            glBegin(GL_QUADS); //create polygon
            glTexCoord2f((part/3.f), 0.0f);glVertex2d(nx, y);
            glTexCoord2f(((part+1.f)/3.f), 0.0f);glVertex2d(x2, y);
            glTexCoord2f(((part+1.f)/3.f), 1.0f);glVertex2d(x2, ny2);
            glTexCoord2f((part/3.f), 1.0f);glVertex2d(nx, ny2);
            glEnd();
            break;
        }
    }
}
else
{
    glBegin(GL_QUADS); //create polygon
    glTexCoord2f((part/3.f), 0.0f);glVertex2d(x, y);
    glTexCoord2f(((part+1.f)/3.f), 0.0f);glVertex2d(x2, y);
    glTexCoord2f(((part+1.f)/3.f), 1.0f);glVertex2d(x2, ny2);
    glTexCoord2f((part/3.f), 1.0f);glVertex2d(x, ny2);
    glEnd();
}

使用glTexCoord2f(x, y)映射紋理時glTexCoord2f(x, y)使用x> 1.0在x方向上重復該紋理glTexCoord2f(x, y)並且對y相同。 如果使用glTexCoord2f(2.5, 3.0); 那么圖像將完全重復2次,再加上其在x方向上寬度的一半和在y方向上3倍的寬度。

您需要大於1.0的紋理坐標(2.0表示兩次,3.0表示三次等),並且還需要設置特定的狀態:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM