Когда я нахожусь по одну сторону от текстуры, она прозрачна и выглядит как нужно:
Но если я нахожусь с противоположной стороны от текстуры, с двумя ее сторонами что-то не так:
Текстура на всех гранях одна и та же.
Код загрузки текстур:
GLuint Render::loadTexture(const sf::String & name)
{
sf::Image image;
if (!image.loadFromFile(name))
return EXIT_FAILURE;
image.flipVertically();
GLuint texture = 0;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, image.getSize().x, image.getSize().y, GL_RGBA, GL_UNSIGNED_BYTE, image.getPixelsPtr());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 0x812F);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 0x812F);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
return texture;
}
Код отрисовки куба:
glTranslatef(x, y, z);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(-size, -size, -size);
glTexCoord2f(1, 0); glVertex3f(size, -size, -size);
glTexCoord2f(1, 1); glVertex3f( size, size, -size);
glTexCoord2f(0, 1); glVertex3f( -size, size, -size);
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[1]);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(size, -size, size);
glTexCoord2f(1, 0); glVertex3f(-size, -size, size);
glTexCoord2f(1, 1); glVertex3f( -size, size, size);
glTexCoord2f(0, 1); glVertex3f( size, size, size);
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[2]);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(-size, -size, size);
glTexCoord2f(1, 0); glVertex3f(-size, -size, -size);
glTexCoord2f(1, 1); glVertex3f(-size, size, -size);
glTexCoord2f(0, 1); glVertex3f(-size, size, size);
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[3]);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(size, -size, -size);
glTexCoord2f(1, 0); glVertex3f(size, -size, size);
glTexCoord2f(1, 1); glVertex3f(size, size, size);
glTexCoord2f(0, 1); glVertex3f(size, size, -size);
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[4]);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(-size, -size, size);
glTexCoord2f(1, 0); glVertex3f(size, -size, size);
glTexCoord2f(1, 1); glVertex3f( size, -size, -size);
glTexCoord2f(0, 1); glVertex3f( -size, -size, -size);
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[5]);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(-size, size, -size);
glTexCoord2f(1, 0); glVertex3f(size, size, -size);
glTexCoord2f(1, 1); glVertex3f( size, size, size);
glTexCoord2f(0, 1); glVertex3f( -size, size, size);
glEnd();
glTranslatef(-x, -y, -z);
Ответ
Проблемы в обоих случаях - скрытые грани куба рисуются некорректно. Проверьте, что у Вас выставлен GL_ALPHA_TEST.
https://stackoverflow.com/questions/9353210/rendering-glitch-with-gl-depth-test-and-transparent-textures
Кроме того, если альфа не дискретна 0/1, попробуйте такой подход:
Порядок наложения текстур влияет на работу alpha-канала. Как это обойти?
Комментариев нет:
Отправить комментарий