OpenGL正确实现多种材料

时间:2016-07-02 13:33:41

标签: java opengl glsl

我正在开发一个有多个需要多种材质的物体的游戏场景。我在网上广泛搜索,但我找不到任何令人满意的解决方案。

我的场景就像一条河流流过,那里的材料无论如何都需要一个单独的着色器(它会将许多镜面和法线贴图组合成看似河流的地图)然后会有一个混合两个的地形(草)和沙子纹理)需要另一个着色器。还有一个有手和爱情的球员。

编辑:基本上我希望找到制作最灵活的多材质/着色器实现的最有效方法。

简而言之,周围有许多复杂的物体需要不同的着色器。它们数量不多,但有很多复杂性。

因此,很多次使用glUseProgram()似乎不是最明智的想法。此外,许多着色器代码都可以像点光源计算一样进行通用。制作通用着色器并使用if和State制服可能会起作用,仍然需要不同的着色器用于河流以及同样发散材料。

我基本上不了解这种通用系统的组织和实现。我使用了像Unreal或Blender这样的引擎,这些引擎使用基于节点的材料,并允许自定义每种材料而不会有太多延迟。这样的系统将如何转换为基础GPU代码?

1 个答案:

答案 0 :(得分:1)

如果由于过多glUseProgram()次呼叫而确实面临时间问题,您可能需要查看shader subroutines并使用更少但更大的程序。在此之前,将数据排序为仅在需要时更改状态(例如,每个着色器按照每种材质排序)。我想无论如何这总是一个很好的做法。

老实说,我不认为你的计时问题来自使用太多程序。例如,您可能希望使用frustum culling(以避免将几何体发送到将被剔除的GPU)和early z-culling(以避免对将被覆盖的片段进行复杂的照明计算)。您还可以将level of detail用于远处复杂的几何图形,因此不需要太多细节。