将数据传递到不同的着色器

Posted

技术标签:

【中文标题】将数据传递到不同的着色器【英文标题】:Passing data into different shaders 【发布时间】:2012-12-28 14:50:03 【问题描述】:

假设我的 Shaderprogram 包含一个 Vertex- 和一个 Fragmentshader。

如何将信息直接传递给片段着色器?

当我使用 gl_uniform... 并指定我想在片段着色器中寻址的变量时,它会抛出如下错误:

Using ShaderProgram: The fragment shader uses varying myVarHere, but previous 
shader doesnot write to it.

由于我首先附加了顶点着色器,我发现我需要使用 in 和 out 来“通过”顶点着色器“传递信息”。

我不确定这是否是要走的路,所以我的问题是:有没有办法告诉 opengl 在某个着色器中处理变量,或者我在做/理解什么可怕的错误?

顶点着色器:

#version 130

precision highp float;

uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;

in vec3 vertexData;
in vec3 normalData;

out vec3 normal;

void main(void)

    normal = (model * view * vec4(normalData, 0)).xyz;
    gl_Position = projection * model * view * vec4(vertexData, 1);

片段:

#version 130

precision highp float;

in vec3 light0;  // <- this is what i want to fill with data


const vec3 ambient = vec3(0.0, 0.0, 0.0);

const vec3 lightColor = vec3(0.6, 0.0, 0.0);

in vec3 normal;
out vec4 out_frag_color;

void main(void)

     float diffuse = clamp(dot(normalize(light0), normalize(normal)), 0.5, 1.0);
     out_frag_color = vec4(ambient + diffuse * lightColor, 1.0);

【问题讨论】:

【参考方案1】:

似乎您希望light0 成为制服。

只要把它做成制服:

#version 130

precision highp float;

uniform vec3 light0;  

...

【讨论】:

该死,这样比我想象的要容易得多。非常感谢。

以上是关于将数据传递到不同的着色器的主要内容,如果未能解决你的问题,请参考以下文章

将音频频谱作为libGDX中的纹理传递到着色器

通过顶点属性指针将颜色坐标传递到顶点着色器

将不同类型的值传递给着色器

将 Metal 缓冲区传递给 SceneKit 着色器

OpenGL:为啥我不能将单个浮点数从顶点着色器传递到片段着色器?

osg学习(七十一)如何给顶点着色器传递顶点数据