2014-12-25 3 views
0

Это действительно странно:Использование необъявленной идентификатора 'gl_LightSource'

вот некоторые журнала:

OpenGL Version = 4.1 INTEL-10.2.40 
vs shaderid = 1, file = shaders/pointlight_shadow.vert 
- Shader 1 (shaders/pointlight_shadow.vert) compile error: ERROR: 0:39: Use of undeclared identifier 'gl_LightSource' 

BTW, я использую C++/OpenGL/GLFW/GLEW на Mac OS X 10.10. Есть ли способ проверить все версии или атрибуты, необходимые для использования «gl_LightSource» на языке шейдеров?

Shader файл:

#version 330 

// Input vertex data, different for all executions of this shader. 
layout(location = 0) in vec3 vertexPosition_modelspace; 
layout(location = 1) in vec2 vertexUV; 
layout(location = 2) in vec3 vertexNormal_modelspace; 
layout(location = 3) in vec3 vertexTangent_modelspace; 
layout(location = 4) in vec3 vertexBitangent_modelspace; 


out vec4 diffuse,ambientGlobal, ambient; 
out vec3 normal,lightDir,halfVector; 
out float dist; 
out vec3 fragmentcolor; 
out vec4 ShadowCoord; 

//Model, view, projection matrices 
uniform mat4 MVP; 
uniform mat4 V; 
uniform mat4 M; 
uniform mat3 MV3x3; 
uniform mat4 DepthBiasMVP; 

void main() 
{ 
    //shadow coordinate in light space... 
    ShadowCoord = DepthBiasMVP * vec4(vertexPosition_modelspace,1); 

    // first transform the normal into camera space and normalize the result 
    normal = normalize(MV3x3 * vertexNormal_modelspace); 

    // now normalize the light's direction. Note that according to the 
    // OpenGL specification, the light is stored in eye space. 
    gl_Position = MVP * vec4(vertexPosition_modelspace,1); 
    vec3 vertexPosition_worldspace = (M * vec4(vertexPosition_modelspace,1)).xyz; 
    vec3 vertexPosition_cameraspace = (V * M * vec4(vertexPosition_modelspace,1)).xyz; 

    //light 
    vec3 light0_camerapace = (V* vec4(gl_LightSource[0].position.xyz,1)).xyz; 
    vec3 L_cameraspace= light0_camerapace-vertexPosition_cameraspace; 
    lightDir = normalize(L_cameraspace); 


    // compute the distance to the light source to a varying variable 
    dist = length(L_cameraspace); 

    // Normalize the halfVector to pass it to the fragment shader 
    { 

     // compute eye vector and normalize it 
     vec3 eye = normalize(-vertexPosition_cameraspace); 

     // compute the half vector 
     halfVector = normalize(lightDir + eye); 
    } 

    // Compute the diffuse, ambient and globalAmbient terms 
    diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse; 
    ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient; 
    ambientGlobal = gl_LightModel.ambient * gl_FrontMaterial.ambient; 
} 
+0

Вы пропустили инструкцию '# include'? –

ответ

3

Вы не задавать профиль в шейдерной версии:

#version 330 

по умолчанию в этом случае core, что соответствует основной OpenGL профиля. На некоторых платформах, вы можете изменить это с помощью профиля совместимости:

#version 330 compatibility 

Но так как вы говорите, что вы работаете на Mac OS, что это не вариант для вас. Mac OS поддерживает только основной профиль OpenGL 3.x и более поздних версий.

Причина, по которой ваш шейдер не скомпилирован с основным профилем, заключается в том, что вы используете кучу устаревших предопределенных переменных. Например:

gl_FrontMaterial 
gl_LightSource 
gl_LightModel 

Все они сочетаются со старым контуром фиксированной функции, который больше не доступен в профиле ядра. Вам нужно будет определить свои собственные равномерные переменные для этих значений и передать значения в шейдер с помощью вызовов glUniform*().

Я написал более подробное описание того, что произошло со встроенными переменными GLSL при переходе к основному профилю в ответе здесь: GLSL - Using custom output attribute instead of gl_Position.

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