如何在OpenGL中添加多次传递光?

时间:2012-08-07 05:48:39

标签: ios opengl-es lighting multipass

我有两个函数要结合以下结果:

drawAmbient
drawDirectional

它们各自单独工作,仅使用环境光或仅使用定向光绘制场景。我想要显示环境光和定向光,但我有点麻烦。我试试这个:

[self drawAmbient];

glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_ONE, GL_ONE);

[self drawDirectional];

glDisable(GL_BLEND);

但我只看到第一个draw的结果。我以相同的方式计算两组绘制调用的深度。我总是可以渲染到纹理并混合纹理,但这似乎是多余的。我是否可以在渲染到默认帧缓冲区时将光源添加到一起?

2 个答案:

答案 0 :(得分:3)

你说你在两次传球中以相同的方式计算深度。这当然是正确的,但由于默认的深度比较函数是GL_LESS,所以在第二遍中实际上不会呈现任何内容,因为深度永远不会小于深度缓冲区中当前的深度。

因此,对于第二遍,只需将深度测试更改为

glDepthFunc(GL_EQUAL);

然后回到

glDepthFunc(GL_LESS);

或者您也可以将整个运行时间设置为GL_LEQUAL以涵盖这两种情况。

答案 1 :(得分:0)

据我所知,你应该渲染光照以分离渲染目标,然后将它们组合起来。所以你将场景渲染到这些目标中:

  • 没有照明的纹理
  • 摘要漫反射光照(填充环境色并附加渲染所有光源)
  • 汇总镜面光照(如果使用镜面反射分量)

然后组合纹理,final_color = textured * diffuse + specular