起初这听起来可能很懒惰,但我已经研究了 2 天。
我有一个绘制原语的 SDL+GLEW 应用程序。我想从不同的角度制作一些视口。我看到了四个视口,但我无法更改视角。
假设你有
draw();
swapbuffers();
什么是最简单的方法——在 OpenGL3+ 规范中——创建一个透视视口(或者理想情况下是几个)?
这是与 gluPerspective 做同样事情的 GLSL 1.50 代码。您可以轻松地将其转换为您选择的语言,然后通过 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
, then glGetFLoatv(GL_PROJECTION_MATRIX, ...)
, thenglUniform
或glUniformMatrix4fv
对于视口:glViewport
和glScissor
. 或者使用帧缓冲对象,渲染到纹理,然后渲染纹理。
PS如果你不想使用不推荐使用的功能,从gluPerspective文档中获取矩阵公式,自己计算矩阵,然后使用glUniformMatrix4fv。或在兼容性配置文件中工作。