OpenGL:从固定功能到可编程管线的转换

3

我正在尝试将一些代码从使用传统的固定功能管线改为现代可编程管线,并且遇到了一些困难。

目前我的代码看起来像这样:

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之前和之后的例子?


你试过谷歌搜索“矩阵数学”吗?那会给你所有这些函数背后的数学! - vallentin
5
我不知道为什么人们总是在没有提供“为什么”的评论的情况下进行投票。问题显然没有表现出多少研究努力,但人们至少可以告诉发布者,这样他们下次就知道了。 - thokra
1个回答

4
在现代的OpenGL中(即核心3.1或更高版本),移除了过时的功能,矩阵堆栈、矩阵操作函数和基于这些特性的功能(如GLU)已不再可用。有关旧版OpenGL的更多信息,请参见此处
因此,在使用前向兼容上下文的OpenGL 3.1或未公开GL_ARB_compatibility的实现(例如Linux上的Intel Sandy Bridge及更高版本CPU)或在使用核心配置文件上下文的OpenGL 3.2开始,您提到的函数将不可用。在后一种情况下,您可以使用兼容性配置文件上下文继续使用旧内容(尽管对于新代码,我强烈建议不要这样做)。有关配置文件和背后的原理的更多信息,请查看此处
现代使用矩阵的方法是简单地使用您手头上的任何线性代数库,并将计算结果传递给着色器。一个好的库是groovounet的GLM。它还提供了旧的GLU函数的重写,比如glmProjectionglmLookAt,并使用列主矩阵处理所有操作,即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*()函数族将它们传递给着色器。
通常情况下,要了解关于现代OpenGL的大量信息,请查看官方维基和网络上的各种教程,比如我倾向于推荐的这个(因为我知道它很好)。

你好,我发现网上的教程都是针对C++的,并推荐使用GLM库来完成所有的数学计算,但不幸的是我的应用程序是用Delphi编写的。我已经在网上搜索了相关的数学知识,但发现它们与编程相距甚远。我已经成功创建了存储在16x GLFloats数组中的ModelViewMatrix和ProjectionMatrix。现在我需要创建NormalMatrix。我已经提取了ModelViewMatrix左上角的3x3矩阵,但现在需要进行“仿射反演”和“转置”操作...(根据链接)。 - AlexM
Lighthouse3d网站上的页面详细介绍了GLSL中的法线矩阵:链接 - AlexM
@thokra:我想你指的是核心3.2……没有核心3.1这样的东西。你说的是对的,但术语“核心”在上下文创建的词汇表中并不是一个部分;有“3.1规范”(向前兼容上下文),然后是带有GL_ARB_compatibility扩展的“3.1规范”(完整上下文)。3.2是当他们摆脱了所有这些废话,并以明智的方式正式区分了核心和兼容性配置文件上下文。在3.1中,您应该假设除非您的扩展字符串中有GL_ARB_compatibility,否则所有已弃用的功能都已被删除。 - Andon M. Coleman
@thokra:我指的是你在第二段开头使用“核心配置上下文”的术语。这在GL 3.1中没有定义,“核心配置文件”最接近的东西是向前兼容。 - Andon M. Coleman
@AndonM.Coleman:已编辑!抱歉有些不必要,但是信息量大且正确的发泄。 ;) - thokra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接