glModelMatrix函数用于修改投影或模型矩阵并正确计算顶点位置。 但是,由于我使用VAO,VBO和着色器程序,魔法不再发生。 (与gluPerspective或gluOrtho相同的问题)
我应该自己计算模型和投影矩阵并将它们发送到着色器吗?
答案 0 :(得分:3)
是的,一般的想法是自己执行矩阵计算。实际上没有严肃的3D程序曾经使用旧的OpenGL矩阵堆栈。使用旧的OpenGL矩阵函数没有任何好处,除了它们让初学者更方便一点(不,也没有GPU加速)。坦率地说,OpenGL首先应该没有它们,GLU应该提供基本的矩阵函数。
任何可以使用4×4矩阵的矩阵数学库都可以。 GLM在c ++人群中非常受欢迎,在https://github.com/jroyalty/jglm有一个名为jGLM的Java转换
答案 1 :(得分:2)
是的!
(如果您使用C ++ GLM作为库来帮助解决这个问题,那么它很有用。对于使用LWJGL的Java,请继续阅读...)
//-- Update matrices
// Reset view and model matrices
viewMatrix = new Matrix4f();
modelMatrix = new Matrix4f();
// Translate camera
Matrix4f.translate(cameraPos, viewMatrix, viewMatrix);
// Scale, translate and rotate model
Matrix4f.scale(modelScale, modelMatrix, modelMatrix);
Matrix4f.translate(modelPos, modelMatrix, modelMatrix);
Matrix4f.rotate(this.degreesToRadians(modelAngle.z), new Vector3f(0, 0, 1), modelMatrix, modelMatrix);
Matrix4f.rotate(this.degreesToRadians(modelAngle.y), new Vector3f(0, 1, 0), modelMatrix, modelMatrix);
Matrix4f.rotate(this.degreesToRadians(modelAngle.x), new Vector3f(1, 0, 0), modelMatrix, modelMatrix);
// Upload matrices to the uniform variables
GL20.glUseProgram(pId);
projectionMatrix.store(matrix44Buffer); matrix44Buffer.flip();
GL20.glUniformMatrix4(projectionMatrixLocation, false, matrix44Buffer);
viewMatrix.store(matrix44Buffer); matrix44Buffer.flip();
GL20.glUniformMatrix4(viewMatrixLocation, false, matrix44Buffer);
modelMatrix.store(matrix44Buffer); matrix44Buffer.flip();
GL20.glUniformMatrix4(modelMatrixLocation, false, matrix44Buffer);
GL20.glUseProgram(0);
顶点着色器:
#version 150 core
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;
in vec4 in_Position;
in vec4 in_Color;
in vec2 in_TextureCoord;
out vec4 pass_Color;
out vec2 pass_TextureCoord;
void main(void) {
gl_Position = in_Position;
// Override gl_Position with our new calculated position
gl_Position = projectionMatrix * viewMatrix * modelMatrix * in_Position;
pass_Color = in_Color;
pass_TextureCoord = in_TextureCoord;
}
完整来源 - http://lwjgl.org/wiki/index.php?title=The_Quad_with_Projection,_View_and_Model_matrices
简而言之,它更灵活,允许您根据用例进行优化。 OpenGL 1.x使用固定功能渲染管道,依赖于供应商/驱动程序实现,无法进行优化以更好地适应用例。
一个简单的例子是,假设您只想渲染大量的四边形,您可以使用3x3矩阵进行顶点变换,从而节省GPU周期。