【发布时间】:2020-08-15 12:04:31
【问题描述】:
3D 应用程序有一个静态摄像头:
float eyeX = 0.0f;
float eyeY = 0.0f;
float eyeZ = 0.0f;
Matrix.setLookAtM(viewMatrix, 0, eyeX, eyeY, eyeZ,
0f, 0f, -4f, 0f, 1.0f, 0.0f)
那么这个向量用于shader中的眼睛坐标呢?:
const vec4 eyePos = vec4(0.0, 0.0, 0.0, 0.0);
或者需要额外的转换?
注意:阅读帖子What exactly are eye space coordinates?,但我仍然有疑问,因为我的雾着色器无法正常工作。在这个着色器中,计算观察者到物体的距离:
uniform mat4 u_vMatrix;
in vec4 a_position;
out float v_eyeDist;
const vec4 eyePos = vec4(0.0, 0.0, 0.0, 0.0);
...
void main() {
...
vec4 viewPos = u_vMatrix * a_position;
v_eyeDist = sqrt(pow((viewPos.x - eyePos.x), 2.0) +
pow((viewPos.y - eyePos.y), 2.0) +
pow((viewPos.z - eyePos.z), 2.0));
...
}
提前致谢!
解决方案:根据 Rabbid76 的建议,我使用了 length() 函数以及模型视图矩阵。
uniform mat4 u_mvMatrix; // model-view matrix
in vec4 a_position;
out float v_eyeDist;
...
void main() {
...
vec4 viewPos = u_mvMatrix * a_position;
v_eyeDist = length(viewPos);
...
}
【问题讨论】:
标签: java android opengl-es glsl shader