gpt4 book ai didi

opengl - 在 3.3 版中从 OpenGL 获取投影矩阵

转载 作者:行者123 更新时间:2023-12-04 17:58:53 27 4
gpt4 key购买 nike

出于兼容性原因,我必须混合使用旧的和现代的 OpenGL 代码。我想从 OpenGL 中检索当前的投影矩阵和模型 View 矩阵,以使用统一变量将其传递给着色器。

以下代码显示了我仅对投影矩阵执行此操作的尝试。它没有按预期工作:

float m[16];
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, aspect, 0.01f, 2.0f);
glGetFloatv(GL_PROJECTION_MATRIX, m);

在这些行之后,矩阵 m 包含标识。我使用以下代码对此进行了检查:

printf("%f %f %f %f\n", m[0], m[4], m[8],  m[12]);
printf("%f %f %f %f\n", m[1], m[5], m[9], m[13]);
printf("%f %f %f %f\n", m[2], m[6], m[10], m[14]);
printf("%f %f %f %f\n", m[3], m[7], m[11], m[15]);

我使用 freeglut 创建了上下文并使用以下代码明确请求 OpenGL 3.3 上下文:

...
glutInitContextVersion(3, 3);
glutCreateWindow(title);

当我将版本更改为 OpenGL 2.0 时,上面的代码按预期工作。上面的每个版本都会产生所描述的问题。

我正在使用 Intel Corporation Broadwell-U 集成显卡开发 Xubuntu。

有人可以解释这种行为吗?有人可以提供解决方案吗?

最佳答案

>=OpenGL-3.3 兼容性配置文件是一项可选功能,不需要实际支持它。大多数 OpenGL 实现实际上不支持兼容性配置文件。值得注意的异常(exception)是 NVidia 和 AMD 的专有驱动程序。因此,将 OpenGL-3.3 与遗留内容混合使用不会对所有系统都可靠地工作。

但是你为什么要那样做

float m[16];
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, aspect, 0.01f, 2.0f);
glGetFloatv(GL_PROJECTION_MATRIX, m);

……有吗?首先,GLU 不是 OpenGL 的一部分,GLU 函数只是内部调用 OpenGL 函数的小 helper 。无论如何,gluPerspective 函数非常简单,通过 OpenGL 的往返只是为了很好地获得矩阵是尴尬的(老实说,这触发了我的呕吐反射)。

gluPerspective 的核心是确定 glFrustum 的参数:

void gluPerspective(
double fov,
double aspect,
double znear, float zfar)
{
double const height = znear * tanf(fovyInDegrees * M_PI / 360.0);
double const width = height * aspect;
glFrustum(-width, width, -height, height, znear, zfar);
}

这就是它所做的一切。 glFrustum 本身也非常简单。

void glFrustum(double l, double r, double b, double t, double n, double f)
{
double M[4][4];
M[0][0] = 2.f*n/(r-l);
M[0][1] = M[0][2] = M[0][3] = 0.f;

M[1][1] = 2.*n/(t-b);
M[1][0] = M[1][2] = M[1][3] = 0.f;

M[2][0] = (r+l)/(r-l);
M[2][1] = (t+b)/(t-b);
M[2][2] = -(f+n)/(f-n);
M[2][3] = -1.f;

M[3][2] = -2.f*(f*n)/(f-n);
M[3][0] = M[3][1] = M[3][3] = 0.f;
glMultMatrixd(&M[0][0]);
}

重写它以将指向矩阵的指针作为参数,然后您可以直接将其传递给制服是微不足道的。

关于opengl - 在 3.3 版中从 OpenGL 获取投影矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37841701/

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