1

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

drawAmbient
drawDirectional

它们每个都可以单独工作,仅使用环境光或仅使用定向光绘制场景。我想同时显示环境光和定向光,但遇到了一些麻烦。我试试这个:

[self drawAmbient];

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

[self drawDirectional];

glDisable(GL_BLEND);

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

4

2 回答 2

3

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

所以对于第二遍只需将深度测试更改为

glDepthFunc(GL_EQUAL);

然后回到

glDepthFunc(GL_LESS);

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

于 2012-08-07T08:24:24.363 回答
0

据我所知,您应该将照明渲染为单独的渲染目标,然后将它们组合起来。因此,您将把场景渲染到这些目标中:

  • 没有照明的纹理
  • 摘要漫射照明(填充环境颜色并附加渲染所有光源)
  • 摘要镜面照明(如果您使用镜面组件)

然后结合纹理,所以final_color = textured * diffuse + specular.

于 2012-08-07T08:16:09.873 回答