2016-07-02 56 views
0

我正在研究一个需要多种材质的多个物体的游戏场景。我在网上广泛搜索,但我找不到任何满意的解决方案。OpenGL正确实施多种材质

我的场景将会像一条河流流过,而且那里的材质无论如何都需要单独的着色器(它会将许多镜面反射和法线贴图合并成一条看起来像河流的地图),那么会有一个地形混合两个草地和沙地纹理)需要另一个着色器。还有一个玩家的手和爱情和所有。

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

简而言之,周围有很多复杂的物体需要不同的着色器。他们的人数并不多,但却有很多复杂性。

所以使用glUseProgram()很多时候dosn't似乎是最聪明的想法。也有很多着色器代码可以像点光源计算一样通用。制作通用着色器并使用if和状态制服可能有效,但仍需要不同的着色器来处理河流,同样也需要使用不同的材质。

我基本上不了解这样一个通用系统的组织和实现。我已经使用了像Unreal或Blender这样的引擎,它们使用基于节点的材料,并且允许定制每一种材料而没有太多滞后。这样的系统如何转化为基本的GPU代码?

+1

要么你的问题很广泛,要么只是不清楚。我不确定你在问什么。 –

+0

我想你需要一个建立在opengl之上的游戏引擎,是java所必需的? – niceman

+0

@NicolBolas问题:我如何有效地实现多个材质,否则需要单独的着色器? – HuraToTheRescue

回答

1

如果你真的遇到时序问题因为太多glUseProgram()电话,你可能想在shader subroutines看看,并使用较少,但更大的计划。在此之前,只有在需要时才对数据进行排序(例如,按着色器排序,然后按材料排序)。无论如何,我想这总是一个很好的做法。

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

+0

的确没有别的办法。我们必须组织着色器并采用适当的优化来获得我们期望的性能。其全部关于质量和性能之间的平衡。 – HuraToTheRescue