Страницы

Поиск по вопросам

понедельник, 16 декабря 2019 г.

Баг текстуры в Opengl

#opengl


Когда я нахожусь по одну сторону от текстуры, она прозрачна и выглядит как нужно:



Но если я нахожусь с противоположной стороны от текстуры, с двумя ее сторонами что-то
не так:



Текстура на всех гранях одна и та же.

Код загрузки текстур:

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

    


Ответы

Ответ 1



Проблемы в обоих случаях - скрытые грани куба рисуются некорректно. Проверьте, что у Вас выставлен GL_ALPHA_TEST. https://stackoverflow.com/questions/9353210/rendering-glitch-with-gl-depth-test-and-transparent-textures Кроме того, если альфа не дискретна 0/1, попробуйте такой подход: Порядок наложения текстур влияет на работу alpha-канала. Как это обойти?

Комментариев нет:

Отправить комментарий