// Вершинный шейдер: 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); }