Qt & OpenGL: прозрачность текстуры - PullRequest
0 голосов
/ 07 ноября 2018

У меня две текстуры отображаются одинаково. Зеленая текстура имеет правильную прозрачность в нужных местах, но когда я перемещаю розовую текстуру вперед, она показывает цвет фона там, где она должна быть прозрачной.

enter image description here

Это фрагмент кода метода paintGL , который визуализирует текстуры.

void OpenGLWidget::paintGL()
{
    // ...

    for (int i = 0; i < lights.size(); i++)
    {
        glUseProgram(lights[i].program);

        setUniform3fv(program, "lightPosition", 1, &lights[i].position[0]);

        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, lights[i].texture);

        lights[i].svg.setColor(toColor(lights[i].diffuse));
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, lights[i].svg.width(), lights[i].svg.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, lights[i].svg.toImage().constBits());
        glGenerateMipmap(GL_TEXTURE_2D);

        glBindVertexArray(lights[i].vertexArray);
        glDrawElements(GL_TRIANGLES, lights[i].indices.size(), GL_UNSIGNED_BYTE, nullptr);
    }

    update();
}

Метод toImage класса svg создает новый объект QImage из файла svg, поэтому новое значение текстуры должно обновляться с каждым кадром.

Где я делаю не так? Спасибо!

1 Ответ

0 голосов
/ 07 ноября 2018

Это, вероятно, происходит, потому что у вас включено тестирование глубины. Несмотря на то, что части текстуры (частично или полностью) прозрачны, OpenGL по-прежнему записывает данные в буфер глубины, поэтому четверка розового света, кажется, затеняет зеленый свет. Он работает в обратном направлении, потому что розовый свет рисуется первым, поэтому зеленый свет не был записан в буфер глубины в этой точке.

Обычное решение этой проблемы - рендеринг прозрачных текстур в обратном порядке.

Вы также можете просто написать свой фрагментный шейдер в discard фрагменты, если они прозрачны. Но это приводит к артефактам, если у вас есть полупрозрачные фрагменты, которые у вас есть, из-за фильтрации текстур и мипмапов.

...