根据粒子位置更改GLSL着色器颜色

时间:2013-11-13 02:35:02

标签: opengl shader

我目前正致力于一个粒子系统,其中每个粒子都是一个点。我正在使用着色器为粒子着色。我希望粒子根据其位置改变颜色。但是,当我尝试在我的片段和顶点着色器中包含一个额外的矢量变量时,我的着色器不会编译。

片段着色器:

varying vec3 normal; 
varying vec3 vertex_to_light_vector;
varying vec3 vertex_to_eye_vector;
//out vec3 color;
//varying float red;
//varying float green;
//varying float blue;

//black body radiation color map

void main ()
{
    const vec4 AmbientColor = vec4(0.2, 0.2, 0.2, 0.2);
    const vec4 DiffuseColor = vec4(0.0, 0.1,0.3, 0.1);
    const vec4 SpecularColor = vec4(1.0, 1.0, 1.0, 0.1);
    vec3 normalized_normal = normalize(normal);
    vec3 normalized_vertex_to_light_vector = normalize(vertex_to_light_vector);
    vec3 normalized_vertex_to_eye_vector = normalize(vertex_to_eye_vector);
    vec3 bisector = normalize(vertex_to_light_vector + vertex_to_eye_vector);

    float DiffuseTerm = clamp(max(0.0, dot(normalized_normal, normalized_vertex_to_light_vector)), 0.0, 1.0);
    float SpecularTerm = clamp(max(0.0, dot(normalized_normal, bisector)), 0.0, 1.0);

    gl_FragColor = DiffuseColor * DiffuseTerm;
    //+ SpecularColor * pow(SpecularTerm, 80.0);

}

顶点着色器:

varying vec3 normal; 
varying vec3 vertex_to_light_vector;
varying vec3 vertex_to_eye_vector;
//out vec3 color;
//varying float red;
//varying float green;
//varying float blue;
//varying vec2 texture_coordinate;
//uniform sample2D my_color_texture;

void main ()
{
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; //gettingfinal position in projection space

    if (gl_Position[0] > 0.5){
//        color = vec3(1.0, 0.0, 0.0);
//        red =1.0;
//        green = 0.0;
//        blue = 0.0;
    }
    else {
//        color = vec3(0.0, 0.0, 1.0);
//        color[0] = 0.0;
//        color[1] = 0.0;
//        color[2] = 1.0;
//        red = 0.0;
//        green = 0.0;
//        blue = 1.0;
    }

    normal = gl_NormalMatrix * gl_Normal;

    vec4 vertex_in_modelView_space = gl_ModelViewMatrix * gl_Vertex;

    vertex_to_light_vector = vec3(gl_LightSource[0].position - vertex_in_modelView_space); 

    vertex_to_eye_vector = vec3(-vertex_in_modelView_space);

    //texture_coordinate = vec2(gl_MultiTexCoord0);

}

1 个答案:

答案 0 :(得分:3)

由于着色器在第一行上不包含#version指令,因此符合标准的GLSL编译器应将着色器视为GLSL 1.1。这会对您的color输出造成严重问题,因为inout限定符对于OpenGL 3.0GLSL 1.3)之前的不同声明无效。< / p>

实际上发生的事情很可能是编译器遇到out并且这会产生解析错误。请改用varying,因为这些GLSL着色器隐式#version 110

即使着色器是使用#version 130编写的,您还有另一个问题会阻止链接后顶点着色器和片段着色器之间的成功I / O.顶点着色器 输出 是片段着色器 输入 ,因此需要声明您的color变量:顶点着色器中的out vec3 color和片段着色器中的in vec3 color。但同样,这仅适用于针对OpenGL 3.0 GLSL规范编写的现代 OpenGL着色器。 (GLSL 130)或更新。

为了将来参考,如果您在尝试编译着色器后调用glGetShaderInfoLog (...),它会通知您解析错误。同样,在您致电glGetProgramInfoLog (...)glLinkProgram (...)后,glValidateProgram (...)会向您显示任何链接器错误。