Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 渲染到纹理时的图像混合问题_Opengl_Alphablending_Render To Texture - Fatal编程技术网

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)

  • 我使用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 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,这是混合对象覆盖的不透明对象的预期值

    汤姆·福赛斯对预乘阿尔法有很好的理解。整个内容都值得一读,但请参阅“合成半透明层”一节,以了解为什么在一般情况下数学是可行的