2

起初这听起来可能很懒惰,但我已经研究了 2 天。

我有一个绘制原语的 SDL+GLEW 应用程序。我想从不同的角度制作一些视口。我看到了四个视口,但我无法更改视角。

假设你有

draw();
swapbuffers();

什么是最简单的方法——在 OpenGL3+ 规范中——创建一个透视视口(或者理想情况下是几个)?

4

3 回答 3

4

这是与 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);
于 2010-08-18T12:21:53.603 回答
3

最简单的方法是唯一的方法。计算自己(使用一些库、普通数学等)一个投影矩阵,并将其上传到顶点着色器中的制服,并在那里进行转换。

于 2010-08-17T01:26:31.060 回答
2

对于透视矩阵: gluPerspective, then glGetFLoatv(GL_PROJECTION_MATRIX, ...), thenglUniformglUniformMatrix4fv

对于视口:glViewportglScissor. 或者使用帧缓冲对象,渲染到纹理,然后渲染纹理。

PS如果你不想使用不推荐使用的功能,从gluPerspective文档中获取矩阵公式,自己计算矩阵,然后使用glUniformMatrix4fv。或在兼容性配置文件中工作。

于 2010-08-17T01:30:13.343 回答