01-15-2020, 06:54 PM
light_pos нужно трансформировать в видовое пространство. Правильный шейдер будет выглядеть так:
Соответственно, надо также передать в шейдер видовую матрицу:
Код:
[== c++ ==]
varying vec3 normal;
varying vec3 position;
varying vec3 light;
uniform mat4 viewMatrix;
const vec4 light_pos = vec4(0.0, 10.0, 0.0, 1.0);
void main()
{
normal = gl_NormalMatrix * gl_Normal;
position = (gl_ModelViewMatrix * gl_Vertex).xyz;
light = (viewMatrix * light_pos).xyz;
gl_Position = ftransform();
}
Код:
[== c++ ==]
varying vec3 normal;
varying vec3 position;
varying vec3 light;
void main()
{
vec3 N = normalize(normal);
vec3 LN = normalize(light - position);
float L = max(dot(N, LN), 0.0);
vec3 color = gl_FrontMaterial.diffuse * L;
gl_FragColor = vec4(color, 1.0);
}
Соответственно, надо также передать в шейдер видовую матрицу:
Код:
[== c++ ==]
paramViewMatrix = GLSLShaderCreateParameter(shader, 'viewMatrix');
GLSLShaderSetParameterViewMatrix(paramViewMatrix);