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