什么时候在游戏中使用 OpenGL 中的 GLSL 着色器?
When to use GLSL shaders in OpenGL in a game?
我正在学习 GLSL 以及如何进行变换和照明等,但是我只有 1 个着色器程序可应用于所有内容。我不确定我是否应该为游戏中的每个对象(即盒子或玩家模型)设置不同的程序,或者我是否应该只为所有对象设置 1 个着色器。
我该如何使用着色器?它们通常如何使用?
谢谢。
着色器有点像在 GPU 上 运行 而不是 CPU 的函数。拥有一个可以做所有事情的着色器就像拥有一个可以做所有事情的函数;即通常是一个巨大的、无法维护的混乱,到处都是分支。也就是说,为每个对象使用一个着色器通常是矫枉过正,因为许多对象可以使用相同的着色器渲染,只是具有不同的模型或纹理。
例如,您可以使用一个执行光照、法线贴图等的着色器来渲染世界中的对象。但是,HUD 元素不需要任何这些效果;它们通常被绘制为不发光的漫反射纹理,因此您不会使用对它们进行光照的着色器。
我想说一个好的规则是,如果您在着色器中编写了很多分支(if
、switch
等),特别是如果条件基于 uniform
s,那么可能是时候拆分了。
我正在学习 GLSL 以及如何进行变换和照明等,但是我只有 1 个着色器程序可应用于所有内容。我不确定我是否应该为游戏中的每个对象(即盒子或玩家模型)设置不同的程序,或者我是否应该只为所有对象设置 1 个着色器。
我该如何使用着色器?它们通常如何使用?
谢谢。
着色器有点像在 GPU 上 运行 而不是 CPU 的函数。拥有一个可以做所有事情的着色器就像拥有一个可以做所有事情的函数;即通常是一个巨大的、无法维护的混乱,到处都是分支。也就是说,为每个对象使用一个着色器通常是矫枉过正,因为许多对象可以使用相同的着色器渲染,只是具有不同的模型或纹理。
例如,您可以使用一个执行光照、法线贴图等的着色器来渲染世界中的对象。但是,HUD 元素不需要任何这些效果;它们通常被绘制为不发光的漫反射纹理,因此您不会使用对它们进行光照的着色器。
我想说一个好的规则是,如果您在着色器中编写了很多分支(if
、switch
等),特别是如果条件基于 uniform
s,那么可能是时候拆分了。