我正在尝试调整一些代码,使用传统的固定功能管道到现代可编程管道,并且我正在努力。
我目前的代码如下:
procedure TGLCamera.SetModelViewMatrix;
begin
//calculate new look at point
lookAt.x := self.eye.x - forwardVect.x;
lookAt.y := self.eye.y - forwardVect.y;
lookAt.z := self.eye.z - forwardVect.z;
//set modelview matrix mode as current OpenGL matrix mode
glMatrixMode(GL_MODELVIEW);
glLoadIdentity; //load identity as a modelview matrix
//set view parameters using OpenGL command
gluLookAt(self.eye.x, self.eye.y, self.eye.z,
lookAt.x, lookAt.y, lookAt.z,
upVect.x, upVect.y, upVect.z);
end;
我还会使用glMatrixMode,glLoadIdentity& gluLookAt?
你们中的任何人都知道120版之前和之后的一些例子吗?
答案 0 :(得分:4)
在现代核心 OpenGL中,已弃用功能已删除(即核心3.1或更高版本),矩阵堆栈,矩阵操作功能和功能层叠在所述功能之上(像GLU)不再可用。有关旧版OpenGL的更多信息,请参阅this。
因此,当使用具有向前兼容上下文的OpenGL 3.1或不公开GL_ARB_compatibility
的实现时,您提及的功能将无法使用(例如,与英特尔桑迪一样)使用核心配置文件上下文时,在Linux上桥接和更高CPU)或从OpenGL 3.2开始。在后一种情况下,您可以通过使用兼容性配置文件上下文来坚持使用旧的东西(尽管对于新代码,我强烈建议不要使用它)。有关配置文件及其背后的基本原理的更多信息,请查看this。
使用矩阵的现代方法是简单地使用手头的任何线性代数库,只需将计算结果传递给着色器。一个好的图书馆是groovounet的GLM。它还提供旧GLU函数的重写,例如glmProjection
或glmLookAt
,并使用列主矩阵处理所有操作,即OpenGL期望的格式。
例如,以下着色器包含表示模型 - 视图 - 投影矩阵的统一4x4矩阵:
#version 440 // ... or whatever modern version you're targeting
uniform mat4 ModelViewProjection;
layout (location = 0) in vec3 Position; // the attribute storage class is also gone in
modern GLSL, layouts are very handy, e.g. to
avoid application-side location queries
void main()
{
gl_Position = ModelViewProjection * vec4(Position, 1.0);
}
在API级别(即在您的应用程序中),您需要以现代OpenGL提供的各种方式将顶点属性传递给着色器,最明显的是使用顶点缓冲区对象作为数据存储和(从OpenGL 3.2开始必需)顶点数组对象,描述如何从所述数据存储中提取属性。当然,您需要计算所有必要的数据,如MVP矩阵,并使用统一缓冲区对象或经典glUniform*()
函数系列将它们传递给着色器。 / p>
总体而言,为了获得有关现代OpenGL的大量信息,请查看官方wiki以及网上的各种教程,例如this我倾向于推荐(因为我知道它很好)