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;

//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);

}
4

1 に答える 1

3

シェーダーには最初の行にディレクティブが含まれていないため、準拠する GLSL コンパイラはシェーダーをGLSL 1.1#versionとして扱うことになっています。OpenGL 3.0 ( GLSL 1.3 ) より前では、修飾子と修飾子はさまざまな宣言に対して有効ではなかったため、これは出力に深刻な問題を引き起こします。colorinout

おそらく実際に起こっていることは、コンパイラが遭遇しout、これが解析エラーを生成していることです。varyingこれらの GLSL シェーダは暗黙的に であるため、代わりに使用してください#version 110

シェーダが を使用して記述されている場合でも、#version 130リンク後に頂点シェーダとフラグメント シェーダの間の正常な I/O を妨げる別の問題があります。頂点シェーダーの出力はフラグメント シェーダーの入力であるため、頂点シェーダーとフラグメント シェーダーでcolor変数を宣言する必要があります。ただし、これは OpenGL 3.0 GLSL 仕様に対して記述された最新のOpenGL シェーダーにのみ適用されます。(GLSL 130) 以降。out vec3 colorin vec3 color

For future reference, if you were to call glGetShaderInfoLog (...) after attempting to compile your shaders, it would inform you of the parse error. Likewise, glGetProgramInfoLog (...) will give you any linker errors after you call glLinkProgram (...) or glValidateProgram (...).

于 2013-11-13T02:42:00.037 に答える