2013-11-13 5 views
0

В настоящее время я работаю над системой частиц, в которой каждая частица является точкой. Я использую шейдеры для окраски частиц. Я хотел бы, чтобы частица изменила цвета на основе своего положения. Однако, когда я пытаюсь включить дополнительную векторную переменную в свои фрагменты и вершинные шейдеры, мои шейдеры не компилируются.Изменение цвета шейдера GLSL на основе положения частиц

Фрагмент шейдеры:

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

} 

Vertex шейдеров:

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

} 

ответ

3

Поскольку ваш шейдер не содержит #version директиву на первой линии, совместимый GLSL компилятор должен обработать ваш шейдер, как GLSL 1.1 , Это создает серьезную проблему с вашим выходом color, поскольку квалификаторы in и out недействительны для разных объявлений до OpenGL 3.0 (GLSL 1.3).

Более чем вероятно, что на самом деле происходит то, что компилятор встречается с out, и это порождает ошибку синтаксического анализа. Вместо этого используйте varying, так как эти шейдеры GLSL неявно #version 110.

Даже если шейдеры были написаны с использованием #version 130, у вас есть еще одна проблема, которая предотвратит успешный ввод-вывод между шейдером вершин и шейдером фрагмента после компоновки. Vertex Shader выходы являются пиксельный шейдер входы, таким образом, ваша color переменная должны быть объявлены: out vec3 color в вершинном шейдере и in vec3 color в пиксельный шейдер. Но опять же, это относится только к современным шейдерам OpenGL, написанным против спецификации OpenGL 3.0 GLSL. (GLSL 130) или новее.

Для дальнейшего использования, если вы должны были позвонить glGetShaderInfoLog (...) после попытки скомпилировать ваши шейдеры, он сообщит вам об ошибке синтаксического анализа. Аналогично, glGetProgramInfoLog (...) предоставит вам любые ошибки компоновщика после того, как вы позвоните glLinkProgram (...) или glValidateProgram (...).

Смежные вопросы