【发布时间】:2015-04-26 14:58:51
【问题描述】:
我正在使用 vecmath 库来帮助处理矩阵数学,同时我正在转换 opengl 程序以更好地利用 glsl。
写完问题后,我想我有 3 个小问题:
- 模型矩阵的值从何而来?
- 我是否需要重置
display()中的所有模型、视图和投影矩阵?即每一帧 - 是否在绘制每个对象后重置模式、视图和投影矩阵?
这就是我在GLEventListener 的reshape 函数中计算projection 和view 矩阵的方式。..
Matrix4f mProjectionMatrix = createPerspectiveProjection(
60.0f, width / height, 0.1f, 100.0f);
Matrix4f mViewMatrix = new Matrix4f();
mViewMatrix.setIdentity();
辅助函数..
private Matrix4f createPerspectiveProjection(float fov, float aspect, float zNear, float zFar){
Matrix4f mat = new Matrix4f();
float yScale = (float) (1 / (Math.tan(Math.toRadians(fov / 2))));
float xScale = yScale / aspect;
float frustrumLength = zFar - zNear;
mat.m00 = xScale;
mat.m11 = yScale;
mat.m22 = -((zFar + zNear) / frustrumLength);
mat.m23 = -1;
mat.m32 = -((2 * zFar * zNear) / frustrumLength);
mat.m33 = 0;
return mat;
}
在GLEventListener 中的display() 内部,我不确定接下来的步骤。
从概念上讲,我有以下想法,这些是我需要执行的正确步骤吗? ..
public void display(GLAutoDrawable gLDrawable){
// reset view matrix, needed?
// Calculate the model view projection matrix .. where does model matrix get it's values from?
// translate to Square1's position?
// rotate to Square1's angle?
// draw Square1 .. passing MVP matrix
// translate to Square2's position?
// rotate to Square2's angle?
// draw Square2 .. passing MVP matrix
}
这是我的顶点着色器..
uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
void main() {
gl_Position = uMVPMatrix * vPosition;
}
【问题讨论】:
-
Stack Overflow 的推荐格式是每个线程一个问题。虽然您的子问题可能或多或少密切相关,但考虑将它们可能分离为单独的问题线程是一个好主意。这将提高您获得每个问题的好答案的机会,并且符合Stack Overflow 的建议。