我有一个渲染立方体的 OpenGL 着色器程序。为了给立方体着色,我将每个顶点的法线传递给顶点着色器,并计算其相对于点光源的灰度阴影。
但是,我现在还想渲染一个红色三角形,其颜色始终为红色且不依赖于照明。但是如果我像以前一样将法线传递给顶点着色器,三角形的颜色会受到光线的影响。
什么是最好的解决方案?我应该在着色器之前计算顶点颜色,并将其传递给顶点着色器吗?或者这是不好的做法?
有两个主要选项:
使用一个足够灵活的着色器程序来处理这两种情况。
对于应用基本光照的着色器,通常会传入确定光照方程中环境和漫反射项权重的值(通常作为制服)。使用这样的着色器,如果您想要部分对象的纯色,您只需通过相应地设置统一来一直调高环境项。
使用不同的着色器程序。
每一种都有好处,你必须弄清楚哪种最适合你。
方法 1 的主要缺点是您的着色器可能会做比需要更多的工作。在这个例子中,它仍然会评估实体对象的光照方程的漫反射项,即使它对最终结果没有贡献。如果您绘制大量实体几何图形,则可能会影响性能。
方法 2 的主要缺点是您必须切换着色器。如果您经常在实体渲染和光照渲染之间切换,则会影响性能。解决此问题的一种方法是首先绘制所有发光对象,然后绘制所有实体对象,这样每帧只需切换一次着色器。根据您的软件架构,这可能很容易做到,或者可能需要进行大量重组。