【发布时间】:2010-08-17 00:57:21
【问题描述】:
起初这听起来可能很懒惰,但我已经研究了 2 天。
我有一个绘制图元的 SDL+GLEW 应用程序。我想从不同的角度制作一些视口。我看到了四个视口,但无法更改视角。
假设你有
draw();
swapbuffers();
在 OpenGL3+ 规范中,创建透视视口(或理想情况下是多个)的最简单方法是什么?
【问题讨论】:
起初这听起来可能很懒惰,但我已经研究了 2 天。
我有一个绘制图元的 SDL+GLEW 应用程序。我想从不同的角度制作一些视口。我看到了四个视口,但无法更改视角。
假设你有
draw();
swapbuffers();
在 OpenGL3+ 规范中,创建透视视口(或理想情况下是多个)的最简单方法是什么?
【问题讨论】:
这是 GLSL 1.50 代码,用于执行与 gluPerspective 相同的操作。您可以轻松地将其转换为您选择的语言,然后通过 glUniformMatrix4fv 上传。
mat4 CreatePerspectiveMatrix(in float fov, in float aspect,
in float near, in float far)
{
mat4 m = mat4(0.0);
float angle = (fov / 180.0f) * PI;
float f = 1.0f / tan( angle * 0.5f );
/* Note, matrices are accessed like 2D arrays in C.
They are column major, i.e m[y][x] */
m[0][0] = f / aspect;
m[1][1] = f;
m[2][2] = (far + near) / (near - far);
m[2][3] = -1.0f;
m[3][2] = (2.0f * far*near) / (near - far);
return m;
}
然后你做:
mat4 worldMatrix = CreateSomeWorldMatrix();
mat4 clipMatrix = CreatePerspectiveMatrix(90.0, 4.0/3.0, 1.0, 128.0);
gl_Position = worldMatrix * clipMatrix * myvertex;
some_varying1 = worldMatrix * myvertex;
some_varying2 = worldMatrix * vec4(mynormal.xyz, 0.0);
【讨论】:
最简单的方法是唯一的方法。计算自己(使用一些库、普通数学等)一个投影矩阵,并将其上传到顶点着色器中的制服,然后在那里进行转换。
【讨论】:
对于透视矩阵:
gluPerspective,然后是glGetFLoatv(GL_PROJECTION_MATRIX, ...),然后是glUniform 或glUniformMatrix4fv
对于视口:glViewport 和 glScissor。或者使用帧缓冲对象,渲染到纹理,然后渲染纹理。
附:如果您不想使用已弃用的功能,请从gluPerspective 文档中获取矩阵公式,自己计算矩阵,然后使用 glUniformMatrix4fv。或者在兼容性配置文件中工作。
【讨论】: