在OpenGL中,仅使用OpenGL3+;方法?

在OpenGL中,仅使用OpenGL3+;方法?,opengl,opengl-3,Opengl,Opengl 3,一开始这听起来很懒,但我已经研究了两天了 我有一个SDL+GLEW应用程序,可以画一个原语。我想从不同的角度创建几个视口。我看到了四个视口,但无法更改透视图 假设你有 draw(); swapbuffers(); 在OpenGL3+规范中,创建透视视口(或理想情况下创建多个透视视口)最简单的方法是什么?最简单的方法是唯一的方法。计算自己(使用一些库、普通数学等)的投影矩阵,并将其上载到顶点着色器中的统一体,然后在那里进行变换。对于透视矩阵: glUniform,然后glgetfloav(GL\

一开始这听起来很懒,但我已经研究了两天了

我有一个SDL+GLEW应用程序,可以画一个原语。我想从不同的角度创建几个视口。我看到了四个视口,但无法更改透视图

假设你有

draw();
swapbuffers();

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

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

对于透视矩阵:
glUniform
,然后
glgetfloav(GL\u投影矩阵,…)
,然后
glUniform
glUniformMatrix4fv

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


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

下面是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);

只要一杯酒。使用透视图假定使用矩阵堆栈,这是不推荐的。问题的背景是避免使用不推荐的功能。最好手动计算矩阵值,然后使用glUniformMatrix4fv@MadsElvheim:“哪个是不推荐的”所以,他们不推荐使用矩阵堆栈,但没有提供替换的数学函数?太好了。@SigTerm:不,他们为什么要这么做?这就是首先删除该功能的原因。这是几行代码。OpenGL是一个用于渲染的底层库。任何使用OpenGL的非平凡程序都很可能有自己的线性代数函数或类。OpenGL从来就不是一个实用程序库。这是为了快速(图形)。OpenGL 3.1和更高版本对此进行了修正。DirectX是一个完整的游戏框架。OpenGL是一个平台无关库,仅用于渲染。然而,对于固定功能管道的弃用(以及随后的删除),您并不是唯一有意见的人。我想有两个思想阵营。一方希望OpenGL具有丰富的特性和大量的辅助函数。另一个阵营想要一个干净、小而高效的库,它可以对计算机图形学背景不高的人提出要求。OpenGL 3.0已经很老了。OpenGL 3.0中不推荐使用的所有内容(线条厚度除外)都在3.1中删除,并添加到一个单独的扩展,即GL_ARB_兼容性。所以它不再是核心规范的一部分。最新版本是4.1。OpenGL 3.3是作为没有DirectX11功能的硬件的中间版本发布的,因此3.3是DirectX10(.1)硬件的最后一个版本;但是从技术上讲是正确的。@Lela你可以要求一个更详细的答案,我稍后会提供。我不再迫切需要它,但我想它可能会对网站有所帮助。