带照明和不带照明的 OpenGL 顶点颜色

Kar*_*rus 2 opengl

我有一个渲染立方体的 OpenGL 着色器程序。为了给立方体着色,我将每个顶点的法线传递给顶点着色器,并计算其相对于点光源的灰度阴影。

但是,我现在还想渲染一个红色三角形,其颜色始终为红色且不依赖于照明。但是如果我像以前一样将法线传递给顶点着色器,三角形的颜色会受到光线的影响。

什么是最好的解决方案?我应该在着色器之前计算顶点颜色,并将其传递给顶点着色器吗?或者这是不好的做法?

Ret*_*adi 6

有两个主要选项:

  1. 使用一个足够灵活的着色器程序来处理这两种情况。

    对于应用基本光照的着色器,通常会传入确定光照方程中环境和漫反射项权重的值(通常作为制服)。使用这样的着色器,如果您想要部分对象的纯色,您只需通过相应地设置统一来一直调高环境项。

  2. 使用不同的着色器程序。

每一种都有好处,你必须弄清楚哪种最适合你。

方法 1 的主要缺点是您的着色器可能会做比需要更多的工作。在这个例子中,它仍然会评估实体对象的光照方程的漫反射项,即使它对最终结果没有贡献。如果您绘制大量实体几何图形,则可能会影响性能。

方法 2 的主要缺点是您必须切换着色器。如果您经常在实体渲染和光照渲染之间切换,则会影响性能。解决此问题的一种方法是首先绘制所有发光对象,然后绘制所有实体对象,这样每帧只需切换一次着色器。根据您的软件架构,这可能很容易做到,或者可能需要进行大量重组。