C ++ OpenGL повторить - PullRequest
       1

C ++ OpenGL повторить

0 голосов
/ 18 февраля 2012

Я пытался нарисовать часть картинки, но вместо того, чтобы повторить часть картинки, она растянула картинку и выглядела ужасно.

Как я могу повторить изображение вместо того, чтобы растягивать его.

Соответствующая часть кода:

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();
}

Ответы [ 2 ]

6 голосов
/ 18 февраля 2012

при отображении текстуры с использованием glTexCoord2f(x, y) используйте x> 1.0, чтобы повторить ее в направлении x и то же самое для y.Если вы используете glTexCoord2f(2.5, 3.0);, изображение будет повторяться полностью 2 раза, плюс половина его ширины в направлении x и 3 раза в направлении y.

2 голосов
/ 18 февраля 2012

Вам нужны координаты текстуры больше 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...