У меня проблема с освещением, в которой некоторые треугольники, кажется, демонстрируют плохие артефакты затенения, в которых затенение не является гладким на всей поверхности всего полигона (например, на стене) , То есть, каждый треугольник, составляющий многоугольник, кажется, слегка затенен или светлее, чем сосед.WebGL затенение/освещение слишком темное на некоторых треугольниках
Я пытаюсь достичь простого направленного освещения. Вот как это выглядит:
Вот что код вершинного шейдера:
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition.xyz, 1.0);
vNormal = vec3(uNMatrix * vec4(aVertexNormal.xyz, 1.0));
vColor = aVertexMaterialColor;
А вот фрагмент кода шейдера:
vec3 light = normalize(vec3(0.5, 0.2, 1.0));
float amount = max(dot(vNormal, light), 0.0);
vec4 finalColor = vColor;
finalColor.rgb *= amount;
Проблема заключается в том, что стена с окнами имеет различную полосу, где отдельные треугольники кажутся темнее других. Я не могу контролировать геометрию, которую я получаю, но я верю, что треугольники определены нормально, как и нормали.
uPMatrix - проекционная матрица, uMVMatrix - матрица вида модели, а uNMatrix - нормальная матрица. Вот как нормальная матрица создается (GL-матрица):
var mvMatrix = this.getModelViewMatrix();
var nMatrix = this.nMatrix;
mat4.copy(nMatrix, mvMatrix);
mat4.invert(nMatrix, nMatrix);
mat4.transpose(nMatrix, nMatrix);
Любые идеи, что я могу делать неправильно, или как я могу сделать всю стену плавно затененных?
Похоже на классические артефакты освещения вершин, если вы «* не можете управлять геометрией», вы должны обязательно использовать [для фрагментного освещения] (http://learningwebgl.com/blog/?p=1523) –
Спасибо за ответ. Я посмотрю на ссылку ... – superqd