Opengl 渲染到纹理时的图像混合问题
这与我的最后一次约会有关。要获取此图像,请执行以下操作:Opengl 渲染到纹理时的图像混合问题,opengl,alphablending,render-to-texture,Opengl,Alphablending,Render To Texture,这与我的最后一次约会有关。要获取此图像,请执行以下操作: 我画了一个白色背景(颜色=(1,1,1,1)) 我使用color=(1,0,0,8)和blend function(GL\u SRC\u ALPHA,GL\u ONE\u减去SRC\u ALPHA)渲染左上角的两个正方形,然后使用color=(1,1,1,1)和blend function(GL\u ONE,GL\u ONE减去SRC\u ALPHA)绘制纹理 我用color=(1,0,0,8)和混合函数(GL\u SRC\u ALPH
(1,1,1,1)
)(1,0,0,8)
和blend function(GL\u SRC\u ALPHA,GL\u ONE\u减去SRC\u ALPHA)
渲染左上角的两个正方形,然后使用color=(1,1,1,1)
和blend function(GL\u ONE,GL\u ONE减去SRC\u ALPHA)
绘制纹理(1,0,0,8)
和混合函数(GL\u SRC\u ALPHA,GL\u ONE\u减号\u SRC\u ALPHA)
绘制右下角的正方形.8 * (1, 0, 0, .8) + (1 - .8) * (0, 0, 0, 0) = (.8, 0, 0, .64)
(.8, 0, 0, .64) + (1 - .8) * (1, 1, 1, 1) = (1, .2, .2, .84)
.8 * (1, 0, 0, .8) + (1 - .8) * (1, 1, 1, 1) = (1, .2, .2, .84)
所以在白色背景上绘制纹理后,它们应该有颜色
.8 * (1, 0, 0, .8) + (1 - .8) * (0, 0, 0, 0) = (.8, 0, 0, .64)
(.8, 0, 0, .64) + (1 - .8) * (1, 1, 1, 1) = (1, .2, .2, .84)
.8 * (1, 0, 0, .8) + (1 - .8) * (1, 1, 1, 1) = (1, .2, .2, .84)
右下角的正方形应该有颜色
.8 * (1, 0, 0, .8) + (1 - .8) * (0, 0, 0, 0) = (.8, 0, 0, .64)
(.8, 0, 0, .64) + (1 - .8) * (1, 1, 1, 1) = (1, .2, .2, .84)
.8 * (1, 0, 0, .8) + (1 - .8) * (1, 1, 1, 1) = (1, .2, .2, .84)
看起来应该是一样的!我的推理错了吗?我的计算错了吗
无论如何,我的目标是缓存一些场景。如何渲染到纹理,然后绘制该纹理,使其等效于内联绘制场景?哎呀,我的计算错了!第二行应该是
(.8, 0, 0, .64) + (1 - .64) * (1, 1, 1, 1) = (1, .36, .36, .84)
这看起来确实与我看到的相符(当我将最后一个正方形更改为颜色时,
(1,2,2,8)
,所有三个正方形都显示相同的颜色)。关于你的最后一个问题:用纹理替换场景的部分并不是件小事。Stefan Jeschke是一个很好的起点。如果您想将混合内容渲染到纹理并将该纹理合成到屏幕上,最简单的方法是在任何地方使用预乘alpha。要证明这一点适用于您的情况相对简单:预乘形式的半透明正方形的颜色是(0.8,0,0,0.8),并将其与(GL\u ONE
,GL\u ONE减去SRC\u ALPHA
)混合,基本上将正方形的颜色传递到纹理。将(0.8,0,0,0.8)混合在不透明的白色上(GL_ONE
,GL_ONE
)得到(1.0,0.2,0.2,1.0)。请注意,颜色通道与第三次计算相同,但alpha通道仍为1.0,这是混合对象覆盖的不透明对象的预期值
汤姆·福赛斯对预乘阿尔法有很好的理解。整个内容都值得一读,但请参阅“合成半透明层”一节,以了解为什么在一般情况下数学是可行的