Opengl片段着色器第二种颜色

Opengl片段着色器第二种颜色,opengl,graphics,3d,Opengl,Graphics,3d,我有一个碎片着色器的问题,我想得到一个效果,其中两个不同的对象是用不同的灯光照明。这是我的主要代码: glUniform1i(TextureID, 0); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, depthTexture); glUniform1i(ShadowMapID, 1); //Here I draw my first object //Then I want to change light from my f

我有一个碎片着色器的问题,我想得到一个效果,其中两个不同的对象是用不同的灯光照明。这是我的主要代码:

glUniform1i(TextureID, 0);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, depthTexture);
glUniform1i(ShadowMapID, 1);
//Here I draw my first object
//Then I want to change light from my fragment shader to color2.
我的片段着色器:

      // Ouput data
       layout(location = 0) out vec3 color;
       layout(location = 1) out vec3 color2; 
       void main(){
       //Here I calculate my color variables
       }
我不知道如何达到这个效果。我必须写第二个片段着色器吗?有必要吗?

不太必要。 想想片段着色器是什么;它可以为屏幕上的每个像素运行。因此,它通常具有一个颜色输出,表示所述像素的值。片段着色器的多个输出用于MRT(多渲染目标)等高级技术,以避免不必要的几何体计算

如果要在调用之间更改灯光的值,只需更改着色器,然后再次执行drawcall。另一个类似的解决方案是使用UBO


如果逻辑发生了根本性的变化,那么编写不同的着色器是必要的;否则,它们通常具有足够的通用性,只需对数据绑定进行足够的修改,就可以处理诸如更改灯光之类的事情。(不过,改变灯光的数量是另一回事)。

+1:我只是想澄清一点——片段着色器在片段上运行(片段可以覆盖比最终显示设备上的像素更小或更大的区域)。Direct3D实际上使用错误的名称调用像素着色器;)但无论如何,因为它在片段上运行,所以您在屏幕上看到的像素是片段着色器的一个或多个执行与帧缓冲区中已经存在的像素混合的结果。因此,多通道照明可以解释为同一个对象多次绘制并混合在一起。@AndonM.Coleman我知道有人会选择:)。我不想在这个答案中添加额外的复杂性,但似乎我至少应该添加一个脚注。谢谢你的精彩总结。