带有顶点/片段着色器的光。使用不同的变量。 (openGL)

Posted

技术标签:

【中文标题】带有顶点/片段着色器的光。使用不同的变量。 (openGL)【英文标题】:Light with vertex/fragment shader. Using varying variables. (openGL) 【发布时间】:2016-02-27 12:21:26 【问题描述】:

我一直在寻找这个问题。我发现了这个问题Passing data into different shaders,但这个问题不是我的。我得到“片段着色器使用不同的“正常”,但以前的着色器没有写入它。”错误信息。

我的顶点着色器代码:

#version 430

in layout(location=0) vec3 position;
in layout(location=1) vec3 normal;

out vec3 norm;

uniform mat4 transformation;

void main()
   
    gl_Position = transformation * vec4(position, 1.0);
    norm = (transformation * vec4(normal, 0.0)).xyz;

还有我的片段着色器代码:

#version 430

in vec3 normal; 
out vec4 colour;

vec3 lightPos = vec3(0,50,0); 
vec3 lightColor = vec3(0.5, 0, 0); 
vec3 materialColor = vec3(0, 1.0, 0);

void main() 
    float cosTheta = dot(-lightPos, normalize(normal));     
    vec3 temp = materialColor * lightColor * cosTheta;  
    colour = vec4(temp, 1.0); 

主要问题是什么?我不明白这个消息我的顶点着色器使用法线向量并将它传递到片段着色器。我没有看到链接代码和我的代码之间的区别。请告诉我一些想法:\

【问题讨论】:

好吧,我想这是我的大错。 Vertey 着色器输出和片段着色器输入必须具有相同的名称。 他们必须同名,这样解决问题了吗? 【参考方案1】:

如果您出于某种原因想要使用不同的变量名,您可以指定一个位置来匹配输入和输出变量。

例如,在您的情况下:

.vert:

out layout(location = 7) vec3 norm;

.frag:

in layout(location = 7)vec3 normal; 

【讨论】:

以上是关于带有顶点/片段着色器的光。使用不同的变量。 (openGL)的主要内容,如果未能解决你的问题,请参考以下文章

带有着色器的 2D 照明 - 受窗口大小影响的光半径

为啥 gl_Color 不是片段着色器的内置变量?

SpriteKit 中的顶点着色器

片段着色器是不是处理来自顶点着色器的所有像素?

跨多个着色器的 OpenGL 统一

带有片段着色器的 GLSL 仅渲染黑色 GL_POINTS