gpt4 book ai didi

c++ - iPhone OpenGL ES 2.0 渲染到纹理会乘以颜色值而不是相加

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:50:04 26 4
gpt4 key购买 nike

我正在尝试使用 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);

最佳答案

经过大量测试,发现问题是由于 openGL 设置在将渲染目标从屏幕设置为纹理(反之亦然)之间没有正确重置。

我的解决方案是在设置目标后刷新所有 gl 绑定(bind)和调用(如着色器程序)。

不幸的是,我不知道到底是哪个调用或调用组合导致了这种奇怪的行为。

关于c++ - iPhone OpenGL ES 2.0 渲染到纹理会乘以颜色值而不是相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30807209/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com