我正在尝试使用openGL ES 2.0渲染到iPhone上的纹理。
为了测试,我正在渲染一个多边形(只是一个简单的圆圈)。圆圈应该呈现完全红色(rgba颜色为(1,0,0,1))但由于某种原因,它产生的颜色将是它的颜色与我初始化的任何颜色的乘积。渲染纹理。
例如:
Texture init color : (1, 1, 1, 1)
Circle color : (1, 0, 0, 1)
Resulting circle color : (1, 0, 0, 1) //This is as expected
Texture init color : (0.5, 0.5, 0.5, 1)
Circle color : (1, 0, 0, 1)
Resulting circle color : (0.5, 0, 0, 1) //This is unexpected.
根本不应考虑背景颜色。
如果我用更深的红色(0.5,0,0,1)渲染圆圈,那么它将颜色乘以而不是添加它的事实就更明显了。
Texture init color : (1, 1, 1, 1)
Circle color : (0.5, 0, 0, 1)
Resulting circle color : (0.5, 0, 0, 1) //This is as expected
Texture init color : (0.5, 0.5, 0.5, 1)
Circle color : (0.5, 0, 0, 1)
Resulting circle color : (0.25, 0, 0, 1) //This is unexpected.
我的直觉是说这是混合模式的问题,但即使我将glBlendFunc设置为(GL_ONE,GL_ZERO),问题仍然存在。
这也可能是因为渲染使用了预乘的值,但同样,我在这里使用非常简单的值和完整的alpha,这应该忽略这个问题,但我可能错了。
问题:为什么颜色会与背景颜色相乘?
我的RenderTexture设置:
glBindTexture(GL_TEXTURE_2D, 0);
glGenFramebuffers(1, &m_frameBuffer);
glGenTextures(1, &m_textureId);
glBindFramebuffer(GL_FRAMEBUFFER, m_frameBuffer);
glBindTexture(GL_TEXTURE_2D, m_textureId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, MathUtil::NextPowerOf2(m_width), MathUtil::NextPowerOf2(m_height), 0, GL_RGBA, GL_UNSIGNED_BYTE, m_data);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_textureId, 0);
glViewport(0, 0, m_width, m_height);
当我渲染一个对象时,我会调用以下内容:
glEnable(GL_BLEND);
glBlendFuncSeparate(GL_ONE, GL_ZERO, GL_ONE, GL_ZERO);
glDrawElements(GL_TRIANGLES, (GLsizei)(m_offset / 4) * 6, GL_UNSIGNED_SHORT, (void*)0);
最后,我使用glReadPixels读取渲染纹理中的值(我认为,glGetTexImage不适用于iPhone的openGL ES 2.0)以确认这些值。
glReadPixels(0, 0, MathUtil::NextPowerOf2(m_width), MathUtil::NextPowerOf2(m_height), GL_RGBA, GL_UNSIGNED_BYTE, m_data);
答案 0 :(得分:0)
经过大量测试后发现问题是由于openGL设置在将渲染目标从屏幕设置到纹理之间未正确重置(反之亦然)。
我的解决方案是在设置目标后刷新所有gl绑定和调用(如着色器程序)。
不幸的是,我不确切地知道哪个电话或电话组合导致了这种奇怪的行为。