【问题标题】:Specular over texture in OpenGL ES?OpenGL ES中的纹理上的镜面反射?
【发布时间】:2012-08-10 05:07:29
【问题描述】:

我试图在纹理映射的对象上获得镜面高光。据我所知,OpenGL 不计算纹理颜色(例如纯白色)的最终颜色的唯一直接方法是调用 glLightModelf(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR),但 OpenGL ES 不支持此方法。

那么,我该怎么做呢?我是否必须为镜面高光使用其他纹理,还有其他更简单的方法吗?

比你!

附:我正在使用 OpenGL ES 1.x

【问题讨论】:

    标签: android opengl-es lighting


    【解决方案1】:

    一种解决方法是分两次运行:第一次通过环境光和漫反射光渲染纹理,第二次通过在其之上渲染镜面高光(未启用纹理)。

    【讨论】:

    • +1 当然,在这种情况下,您应该使用添加剂混合 (glBlendFunc(GL_ONE, GL_ONE)) 并使用 glDepthFunc(GL_EQUAL) 进行深度测试。
    • 这似乎是正确的方法,但我无法使其完美运行。使用混合功能glBlendFunc(GL_ONE, GL_ONE) 整个物体看起来很亮(灯光是白色的),也许使用其他混合功能会更好,但我不知道哪个
    • 好吧,我的错,我忘记将无纹理对象的材质更改为 0 环境和 0 漫反射,所以只有镜面高光是着色的。现在可以了!谢谢你们!
    【解决方案2】:

    感谢您的好建议,他们挽救了我的一天。唯一的问题是闪烁。我首先认为深度缓冲区和有限的深度分辨率存在问题,但事实并非如此。我不得不使用 gl.glDepthFunc(GL10.GL_ALWAYS);完美融合。但是对于复杂的图元,您将能够看穿对象。

    又玩了一个星期后,我发现在进行混合时只需禁用深度测试,只需注意每次渲染对象的顺序即可。通常,您希望在绘制更近的对象之前完成远对象的所有渲染过程。 这可以解决我完全遇到的闪烁问题。

    【讨论】:

      猜你喜欢
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多