C++, OpenGL - Как нарисовать часть текстуры?

Как нарисовать часть текстуры на языке OpenGL?

код:

glPushMatrix();
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glTranslatef(0, 0, 0);
glBindTexture(GL_TEXTURE_2D, textures[id]);
glBegin(GL_QUADS);
    glColor3f(255, 255, 255);
    glTexCoord2f(0, 0); glVertex2f(0, 0);
    glTexCoord2f(1, 0); glVertex2f(texture->w, 0);
    glTexCoord2f(1, 1); glVertex2f(texture->w, texture->h);
    glTexCoord2f(0, 1); glVertex2f(0, texture->h);
glEnd();

glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
glPopMatrix();

Текстура:

введите сюда описание изображения

Часть которую я хочу нарисовать:

введите сюда описание изображения


Ответы (2 шт):

Автор решения: Kromster

В glTexCoord2f передавайте не 0..1 (это края текстуры), а, в вашем случае, 0..0,25. Таким образом, будет выбираться нужный вам фрагмент текстуры.

Обратите внимание, текстура идет по координатам от 0 до 1, независимо от ее размера в пикселях и соотношения сторон. При выходе за диапазон 0..1, в зависимости от WRAP режима, она будет или повторяться, или отсекаться.


А как мне нарисовать такую-же часть текстуры только в верхнем правом углу?

Ну пример:

glBegin(GL_QUADS);
    glColor3f(255, 255, 255);
    glTexCoord2f(0, 0); glVertex2f(texture->w / 2.0, 0);
    glTexCoord2f(0.25, 0); glVertex2f(texture->w, 0);
    glTexCoord2f(0.25, 0.25); glVertex2f(texture->w, texture->h);
    glTexCoord2f(0, 0.25); glVertex2f(texture->w / 2.0, texture->h);
glEnd();

glBegin(GL_QUADS);
    glColor3f(255, 255, 255);
    glTexCoord2f(0.75, 0); glVertex2f(0, 0);
    glTexCoord2f(1, 0); glVertex2f(texture->w / 2.0, 0);
    glTexCoord2f(1, 0.25); glVertex2f(texture->w / 2.0, texture->h / 2.0);
    glTexCoord2f(0.75, 0.25); glVertex2f(0, texture->h / 2.0);
glEnd();
→ Ссылка
Автор решения: Red Bull

Нашёл решение:

texrX=double(x)/double(texture->w);
texrY=double(y)/double(texture->h);

texrWidth=(double(x)+double(width))/double(texture->w);       
texrHeight=(double(y)+double(height))/double(texture->h);

glPushMatrix();
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glTranslatef(position.x, position.y, 0);
glRotatef(angle, 0, 0, 1);
glTranslatef(-position.x, -position.y, 0);

glTranslatef(position.x, position.y, 0);
glBindTexture(GL_TEXTURE_2D, textures[id]);
glBegin(GL_POLYGON);
    glColor3f(255,255,255);
    glTexCoord2d(texrX, texrY); sprite.getPoint(0);
    glTexCoord2d(texrWidth, texrY); sprite.getPoint(1);
    glTexCoord2d(texrWidth, texrHeight); sprite.getPoint(2);
    glTexCoord2d(texrX, texrHeight); sprite.getPoint(3);
glEnd();

glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
glPopMatrix();
→ Ссылка