Вершинный шейдер освещения glsl - PullRequest
0 голосов
/ 23 мая 2011

У меня проблема с каким-то простым точечным источником света в glsl-шейдере.

Я все еще не понимаю, в каком координатном пространстве нужно сделать освещение.

Сейчас я преобразуюположение по виду модели и нормали по верхнему виду модели 3х3 (без перевода).Я также преобразую световое положение с помощью матрицы вида, чтобы поместить его в то же пространство.

Проблема в том, что световое положение перемещается при перемещении камеры.

void main()  {
attribute vec4 position;
attribute vec3 normal;
attribute vec2 texcoord0;

varying vec4 colorVarying;
varying vec2 texOut0;

uniform mat4 Projection;
uniform mat4 Modelview;
uniform mat3 NormalMatrix;//this is the upper 3x3 of the modelview
uniform vec3 LightPosition; //already transformed by view matrix

vec3 N = NormalMatrix * normal;
vec4 P = Modelview * position;  //no view    
vec3 L = normalize(LightPosition - P.xyz);
float df = max(0.0, dot(N, L.xyz));
vec3 final_color = AmbientMaterial + df * DiffuseMaterial;
colorVarying = vec4(final_color,1);
gl_Position = Projection * Modelview * position;
}

Я понял свою ошибку- Я использую es 2.0 и отправлял свою нормальную матрицу через

glUniformMatrix3fv(gVertexLightingShader->Uniforms[UNIFORM_NORMALMATRIX], 1, 0, m_modelview.data());

Но m_modelview был матрицей 4x4 - поэтому нормальная матрица была неправильной.

1 Ответ

0 голосов
/ 22 ноября 2011

Как сказал @datenwolf, способ вычисления нормальной матрицы будет работать только в том случае, если она ортонормирована, то есть не содержит вращений или масштабирования.

Это способ решить эту проблему:

var normalMatrix = mat3.create();
mat4.toInverseMat3(mvMatrix, normalMatrix);
normalMatrix = mat3.toMat4(normalMatrix);
mat4.transpose(normalMatrix);
...