gpt4 book ai didi

opengl - 适用于每种情况的 GLSL 着色器

转载 作者:行者123 更新时间:2023-12-02 09:32:24 25 4
gpt4 key购买 nike

在我的游戏中,我想为每种情况创建单独的 GLSL 着色器。例如,如果我有 3 个模型 charactershiny Swordblury Ghost 我想设置 renderShaderanimationShaderlightingShadercharacter,然后是 renderShaderlightingShader specularShadershiny Sword,最后我想将 renderShaderlightingShaderblurShader 设置为模糊的幽灵

renderShader 应该将顶点位置乘以投影、世界和其他矩阵,并且它的片段着色器应该简单地将纹理设置到模型。

animationShader 应通过给定的骨骼变换来变换顶点。

lightingShader 应该执行照明,specularLighting 应该执行镜面照明。

blurShader 应该执行模糊效果。

现在首先我如何在不同的着色器上进行多个顶点变换?因为 animationShader 应该计算顶点的动画位置,然后 renderShader 应该获取该位置并通过一些矩阵对其进行转换。

其次,如何更改不同着色器上片段的颜色?

基本想法是我希望能够为每个效果/效果使用不同的着色器,但我不知道如何实现它。

我需要知道应该如何在opengl中使用这些着色器,以及应该如何使用GLSL,以便所有着色器都能相互完成,并且着色器不会关心是否使用另一个着色器。

最佳答案

您所要求的绝对不是微不足道的,并且对于您描述的相对有限数量的“着色器”类型来说可能是极端的杀伤力。

做你想做的事需要开发有效的你自己的着色语言。它可能是 GLSL 的高度#define 版本,但您编写的着色器不会是纯 GLSL。它们将有专门的钩子(Hook),并以代码可以流入其他代码的方式编写。

您需要有自己的方式来指定您的语言的输入和输出。当您想要将着色器连接在一起时,您必须说明谁的输出连接到哪个着色器的输入。一些输入可以来自实际的着色器阶段输入,而其他输入则来自其他着色器。着色器编写的一些输出将是实际的着色器阶段输出,而其他输出将提供给其他着色器。

因此,需要来自另一个着色器的输入的着色器必须在该另一个着色器之后执行。您的系统必须计算出依赖图。

一旦您弄清楚特定着色器序列的所有输入和输出,您就必须获取所有这些着色器文本文件并将它们编译为适当的 GLSL。显然,这是一个不平凡的过程。

您的着色器语言可能如下所示:

INPUT vec4 modelSpacePosition;
OUTPUT vec4 clipSpacePosition;

uniform mat4 modelToClipMatrix;

void main()
{
clipSpacePosition = modelToClipMatrix * modelSpacePosition;
}

您的“编译器”需要对此进行文本转换,将对 modelSpacePosition 的引用转换为实际的顶点着色器输入或由另一个着色器编写的变量(视情况而定)。同样,如果要将 clipSpacePosition 写入 gl_Position,则需要将 clipSpacePosition 的所有使用转换为 gl_Position 。此外,您还需要删除显式输出声明。

简而言之,这将是一项大量工作。

如果您打算这样做,我强烈建议您避免尝试合并顶点着色器和片段着色器的概念。保持该着色器系统在明确定义的着色器阶段内工作。因此,您的“lightingShader”需要是顶点着色器或片段着色器。如果它是片段着色器,则传入它的顶点着色器中的着色器之一将需要以某种方式提供法线,或者您需要片段着色器组件通过某种机制计算法线。

关于opengl - 适用于每种情况的 GLSL 着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16080166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com