28 lines
1.4 KiB
Plaintext
28 lines
1.4 KiB
Plaintext
// Вершинный шейдер:
|
||
attribute vec3 vPosition;
|
||
attribute vec3 vNormal; // <-- Новый атрибут
|
||
|
||
uniform mat4 ProjectionModelViewMatrix;
|
||
uniform mat4 ModelViewMatrix;
|
||
|
||
// Выходные переменные (передаются во фрагментный шейдер)
|
||
varying vec3 vViewNormal;
|
||
varying vec3 vViewPosition;
|
||
|
||
void main()
|
||
{
|
||
// 1. Позиция в пространстве вида (View Space)
|
||
vec4 positionView = ModelViewMatrix * vec4(vPosition, 1.0);
|
||
vViewPosition = positionView.xyz;
|
||
|
||
// 2. Нормаль в пространстве вида (View Space)
|
||
// Преобразуем нормаль, используя ModelViewMatrix. Поскольку нормаль - это вектор,
|
||
// трансляционная часть (четвертый столбец) матрицы нам не нужна.
|
||
// Если бы было неединообразное масштабирование, потребовалась бы Inverse Transpose Matrix.
|
||
// В вашем случае, где есть только униформное масштабирование и вращение,
|
||
// достаточно просто умножить на ModelViewMatrix:
|
||
vViewNormal = normalize((ModelViewMatrix * vec4(vNormal, 0.0)).xyz);
|
||
// W=0.0 для векторов, чтобы игнорировать трансляцию
|
||
|
||
gl_Position = ProjectionModelViewMatrix * vec4(vPosition.xyz, 1.0);
|
||
} |