gpt4 book ai didi

delphi - OpenGL:从固定功能到可编程管线的转变

转载 作者:行者123 更新时间:2023-12-03 15:52:21 24 4
gpt4 key购买 nike

我正在尝试将一些代码从使用遗留的固定功能管道调整为现代可编程管道,但有些困难。

我目前的代码如下所示:

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 版本之前和之后的一些例子吗?

最佳答案

在现代核心具有已弃用功能删除的OpenGL(即核心3.1或更高版本)中,矩阵堆栈、矩阵操作函数和功能分层在所述功能之上(像 GLU)不再可用。有关旧版 OpenGL 的更多信息,请参阅 this .

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

使用矩阵的现代方法是简单地使用您手头的任何线性代数库,并将计算结果简单地传递到着色器。一个好的库是 groovounet 的 GLM 。它还提供旧 GLU 函数的重写,例如 glmProjectionglmLookAt并使用列主矩阵处理所有操作,即 OpenGL 期望的格式。

例如,以下着色器包含表示模型- View -投影矩阵的统一 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 的大量信息,请查看官方 wiki以及网络上的各种教程,例如 this我倾向于推荐一个(因为我知道它很好)。

关于delphi - OpenGL:从固定功能到可编程管线的转变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21112570/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com