【发布时间】:2018-11-07 18:50:30
【问题描述】:
我有两个以相同方式渲染的纹理。绿色纹理在正确的位置具有正确的透明度,但是当我将粉色纹理移到前面时,它会在应该透明的地方显示背景颜色。
这是渲染纹理的 paintGL 方法的 sn-p 代码。
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();
}
svg类的toImage方法从svg文件生成一个新的QImage对象,所以新的纹理值应该随着每一帧更新。
我哪里做错了?谢谢!
【问题讨论】:
-
旁白:每次渲染时无需调用
glTexImage2D和glGenerateMipmap。只有在纹理实际发生变化时才上传纹理并生成 mipmap。
标签: c++ qt opengl textures transparency