После нескольких дней работы моего вершинного шейдера GLSL для правильного отображения вершин я перешел к освещению!Мое понимание освещения / нормалей openGL не слишком велико для любого воображения, так что терпите меня.Я не уверен, какие переводы мне нужно применить к моим нормальным, чтобы они отображались правильно.Вот код приложения, который устанавливает мои огни:
final float diffuseIntensity = 0.9f;
final float ambientIntensity = 0.5f;
final float position[] = { 0f, 0f, 25000f, 0f};
gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, position, 0);
final float diffuse[] = { 0, diffuseIntensity, 0, 1f};
gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, diffuse, 0);
final float ambient[] = { ambientIntensity, ambientIntensity, ambientIntensity, 1f};
gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, ambient, 0);
Довольно стандартные вещи до сих пор.Теперь из-за требований приложения вот вершинный шейдер (несколько странный):
void main()
{
// P is the camera matrix, model_X_matrices are the relative translation/rotation etc of the model currently being rendered.
vec4 pos = gl_ProjectionMatrix * P * modelTranslationMatrix * modelRotationMatrix * modelScaleMatrix * gl_Vertex;
gl_Position = pos;
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_FrontColor = gl_Color;
}
Насколько я понимаю, мне нужно преобразовать gl_Normal
в мировые координаты.Я полагаю, что для моего шейдера это будет:
vec4 normal = modelTranslationMatrix * modelRotationMatrix * modelScaleMatrix * vec4(gl_Normal);
И тогда мне нужно будет получить положение источника света (которое уже было объявлено в коде приложения в мировом пространстве).Я думаю, я бы сделал это следующим образом:
vec3 light_position = gl_LightSource[0].position.xyz;
, а затем нашел бы диффузное значение света, найдя произведение точки нормали и положения света.
Кроме того, я думаю, что в фрагментном шейдере мне просто нужно умножить цвет на это диффузное значение, и все должно работать.Я просто не уверен, как правильно преобразовать нормальные координаты.Правильно ли мое предположение или я совершенно не в курсе?
РЕДАКТИРОВАТЬ: После прочтения, что нормальная матрица (gl_NormalMatrix
) представляет собой всего лишь 3x3 обратную матрице gl_ModelView
, яЯ предполагаю, что правильный способ вычислить нормаль в мировом пространстве - это умножить gl_Normal
на обратное modelTranslationMatrix * modelRotationMatrix * modelScaleMatrix
?Мне все еще нужно умножить это на матрицу P
или это не имеет значения для обычных вычислений?