同一网格上有多个着色器

时间:2014-05-27 13:28:00

标签: opengl 3d glsl shader

我试图创建一个简单的3D游戏引擎。 我可以加载着色器并使用它们,但我有更特别的东西。 我有一个简单的纹理着色器和一个灯光着色器。 它们是单独的着色器,我想一起工作。 但是,如果我使用此着色器进行纹理处理:

//Vertex
layout (location = 0) in vec3 Position;
layout (location = 1) in vec2 TexCoord;
uniform mat4 ModelViewMatrix;
out vec2 TexCoord2;
void main()
{
    gl_Position = ModelViewMatrix * vec4(Position, 1.0);
    TexCoord0 = TexCoord;
}
//Fragment
in vec2 TexCoord0;
out vec4 FragColor;
uniform sampler2D texSampler;
void main() { FragColor = texture2D(texSampler, TexCoord0.st); }

我得到了纹理立方体网格。 此外,我想点亮点光源和环境光。 但是如果使用纹理程序立方体网格不受点光源的影响。 否则,如果我对立方体网格使用点光源着色器,我就无法获得纹理立方体网格。

我无法理解该怎么做。如何将它们结合起来?

1 个答案:

答案 0 :(得分:4)

问题

这实际上触及了一个更复杂的问题"效果"视频引擎设计。已经有关于此的书籍,所以无论如何你还需要更多的文献。然而...

想想着色器。它们中的每一个都提供了您想要的最终结果的部分。但实质上,光着色器使用表面反照率颜色来计算其上的光。与您的颜色纹理基本相同的值。

所以,你必须要做的就是同时使用 。我想将采样器添加到灯光着色器会更简单;只需将变量复制到那里,在代码部分设置制服,你就可以在光线计算中替换反照率;意思是简单地将计算出的光色乘以纹理颜色。

为了使其作为更大系统的一部分工作,但是......它带来了更大的问题,并且可能通过半自动着色器解析和构建等技术来解决。您还可以在不同着色器中创建不同的效果,并将它们链接到一个程序中;这会使手工编写更容易,但最终无法解决向模型自由应用效果的问题。

代码

如果您喜欢代码示例here's a per-vertex lighting/texture/fog shader I wrote quite some time ago。它可能会做得更好,但它对我很有用。您将在同一文件夹中找到附带的片段着色器。如您所见,我将光计算重构为单独的函数;这些函数可以在不同的着色器文件中,这些文件将被单独编译和链接。

将其缩小到一行:

out_Color = mix(light * cubeTexture, skyColor, fogFactor);

多个几何传递

为了完整性,请从评论中删除;您可以使用两个完全独立的管道,只要您愿意为每个管道支付处理每个顶点的成本。这会在某些方面限制你,但在你的例子中,理论上你可以在两个单独的drawcalls上处理纹理和光照,然后只混合两个单独渲染图像的颜色。