与视图矩阵相乘不会影响 OpenGL ES 2.0/3.0 中的结果值
Multiplication by a view matrix does not affect the resulting value in OpenGL ES 2.0/3.0
为了获得恒定方向的光,我将视图矩阵乘以光方向向量:
#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;
换句话说,结果是同样的最差图片。
问题:任何人都可以提出为什么乘以视图矩阵不会影响结果值 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;
这工作正常。
提前致谢!
视图矩阵
Matrix.setLookAtM(viewMatrix, 0, 0f, 0f, 4f, 0.0f, 0f, 0f, 0f, 1.0f, 0.0f)
不影响观看方向,因为观看矩阵的左上3x3是Identity matrix。
因此操作
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)
为了获得恒定方向的光,我将视图矩阵乘以光方向向量:
#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;
换句话说,结果是同样的最差图片。
问题:任何人都可以提出为什么乘以视图矩阵不会影响结果值 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;
这工作正常。
提前致谢!
视图矩阵
Matrix.setLookAtM(viewMatrix, 0, 0f, 0f, 4f, 0.0f, 0f, 0f, 0f, 1.0f, 0.0f)
不影响观看方向,因为观看矩阵的左上3x3是Identity matrix。
因此操作
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)