Умножение на матрицу представления не влияет на результирующее значение в OpenGL ES 2.0 / 3.0 - PullRequest
1 голос
/ 25 мая 2020

Чтобы получить постоянный направленный свет, я умножил матрицу вида на вектор направления света:

#version 300 es
uniform mat4 u_mvMatrix; // model-view matrix
uniform mat4 u_vMatrix; // view matrix
in vec4 a_position;
in vec3 a_normal;
const vec3 lightDirection = vec3(-1.9, 0.0, -5.0);
...
void main() {
    vec3 modelViewNormal = vec3(u_mvMatrix * vec4(a_normal, 0.0));
    vec3 lightVector = -(mat3(u_vMatrix) * lightDirection);
    float diffuseFactor = max(dot(modelViewNormal, lightVector), 0.0);
    ...
}

Но значение diffuseFactor такое же, как и при использовании:

vec3 lightVector = -lightDirection;

In другими словами, получается та же самая худшая картина.

Вопрос: Кто-нибудь может подсказать, почему умножение на матрицу вида не влияет на результирующее значение diffuseFactor?

Примечание: Матрица просмотра создается с использованием:

Matrix.setLookAtM(viewMatrix, rmOffset:0, eyeX:0f, eyeY:0f, eyeZ:0f,
        centerX:0f, centerY:0f, centerZ:-4f, upX:0f, upY:1f, upZ:0f)
fun getVMatrixAsFloatBuffer(): FloatBuffer = Buffers.floatBuffer(viewMatrix)
GLES20.glUniformMatrix4fv(vMatrixLink, 1, false, view.getVMatrixAsFloatBuffer());

Я также проверил правильность матрицы просмотра, используя:

gl_Position = u_pMatrix * u_vMatrix * u_mMatrix * a_position;

Это работает нормально.

Заранее спасибо!

1 Ответ

1 голос
/ 25 мая 2020

Матрица просмотра

Matrix.setLookAtM(viewMatrix, 0, 0f, 0f, 4f, 0.0f, 0f, 0f, 0f, 1.0f, 0.0f)

не влияет на направление просмотра, потому что верхний левый 3x3 матрицы просмотра - это Матрица идентичности .

Следовательно, операция

vec3 lightVector = -(mat3(u_vMatrix) * lightDirection);

умножает вектор lightDirection на единичную матрицу и не меняет вектор вообще.

Используйте другую точку зрения, чтобы увидеть эффект матрицы просмотра. Например:

Matrix.setLookAtM(viewMatrix, 0f, 0f, 2.8f, 2.8f, 0.0f, 0f, 0f, 0f, 1.0f, 0.0f)
...