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

