Delphi OpenGL:从固定功能到可编程管道的转变

Delphi OpenGL:从固定功能到可编程管道的转变,delphi,opengl,matrix,glsl,deprecated,Delphi,Opengl,Matrix,Glsl,Deprecated,我正在尝试将一些代码从使用传统的固定函数管道改为现代的可编程管道,我有点挣扎 我目前有如下代码: 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.

我正在尝试将一些代码从使用传统的固定函数管道改为现代的可编程管道,我有点挣扎

我目前有如下代码:

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和gllookat吗

你们中有人知道120版前后的一些例子吗?

在现代核心OpenGL中,删除了不推荐的功能(即核心3.1或更高版本),矩阵堆栈、矩阵操作功能和上述功能之上的分层功能(如GLU)不再可用。有关传统OpenGL的更多信息,请参阅

因此,当使用具有前向兼容上下文的OpenGL 3.1或不公开
GL\u ARB\u兼容性的实现时(例如,Linux上的Intel Sandy Bridge和更高的CPU),或者从OpenGL 3.2开始,您将无法使用您提到的函数,使用核心配置文件上下文时。在后一种情况下,通过使用兼容性概要文件上下文,您可以坚持使用旧的东西(尽管对于新代码,我强烈建议不要这样做)。有关配置文件及其基本原理的更多信息,请查看

使用矩阵的现代方法是简单地使用手头的任何线性代数库,并简单地将计算结果传递给着色器。一个好的图书馆是groovounet的。它还提供了对旧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*()
函数族将它们传递给着色器


一般来说,要获得关于现代OpenGL的大量信息,请查看web上的官方教程和各种教程,就像我倾向于推荐的那样(“因为我知道它很好)。

你尝试过谷歌搜索“矩阵数学”吗???这将为你提供这些函数背后的所有数学知识!我不知道为什么人们在没有对为什么发表评论的情况下继续投反对票。这个问题没有显示出很多研究成果,这是显而易见的,但至少可以告诉OP,让他们下次知道。我发现网上的欢呼已经是C++的,推荐使用GLM来做所有的数学,但不幸的是应用程序是在Delphi中。我在谷歌上搜索了一下数学,但发现它太脱离编程了。我已经成功地创建了ModelViewMatrix&ProjectionMatrix,它存储在16个glfloat的数组中。我必须创建法线矩阵。我已经提取了ModelViewMatrix左上角的3x3,但现在需要“仿射反转”它并“转置”它。。。(根据)。Lighthouse3d上的页面有很多细节:@thokra:我想你指的是核心3.2。。。没有核心3.1这样的东西。你说的是对的,但“核心”一词实际上还不是语境创造词汇的一部分;先是“3.1规范”(前向兼容上下文),然后是“3.1规范与
GL\u ARB\u兼容性
extension”(完整上下文)。3.2是他们消除了所有这些废话,并以合理的方式正式区分了核心和兼容性概要上下文的时候。在3.1中,除非扩展字符串中有
GL\u ARB\u compatibility
,否则您应该假设所有不推荐的功能都已删除。@thokra:我指的是您在第2段开头使用的术语“core profile”上下文。这在GL 3.1中未定义,与3.1中的“核心配置文件”最接近的是向前兼容。@AndonM.Coleman:Edited!原谅那些不必要的,尽管是信息丰富且正确的咆哮。;)