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

时间:2012-12-28 14:50:04

标签: opengl shader

让我们说我的Shaderprogram包含一个Vertex-和一个Fragmentshader。

如何将信息直接传递给碎片器?

当我使用gl_uniform ...并且指定我希望在fragmet着色器内部进行的变换时,它会抛出这样的错误:

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

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

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

VertexShader:

#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 个答案:

答案 0 :(得分:1)

似乎就像你希望light0成为制服一样。

让它成为制服:

#version 130

precision highp float;

uniform vec3 light0;  

...