当前位置:  开发笔记 > 后端 > 正文

如何在OpenGL 3.x中翻译单个对象?

如何解决《如何在OpenGL3.x中翻译单个对象?》经验,为你挑选了1个好方法。

我有一点经验编写的OpenGL 2应用程序并希望使用OpenGL 3为此,我已经买了艾迪生韦斯利"红书"和"橙色书"(GLSL)的descirbe的固定功能的折旧和学习新的可编程管道(着色器).但是我无法理解的是如何构建一个具有多个对象的场景而不使用已弃用的translate*,rotate*和scale*函数.

我以前在OGL2中做的是使用translate和rotate函数在3D空间中"移动",并使用glBegin ... glEnd在本地坐标中创建我想要的对象.在OGL3中,这些函数都被弃用了,据我所知,它被着色器取代.但是我不能为我制作的每一个对象调用着色器程序,是吗?这不会影响所有其他对象吗?

我不确定我是否已经解释了我的问题令人满意,但其核心是如何使用OpenGL 3.1中本地坐标中定义的多个对象编程场景.我发现的所有初学者教程只使用一个对象而没有/解决这个问题.

编辑:想象一下,你想要两个旋转立方体.手动修改每个顶点坐标会很痛苦,你不能简单地修改模型视图矩阵,因为这样可能会使摄像机围绕两个静态立方体旋转......



1> Bahbar..:

让我们从基础开始.

通常,您希望通过以下步骤转换局部三角形顶点:

local-space coords-> world-space coords -> view-space coords -> clip-space coords

在标准GL中,前2个变换完成GL_MODELVIEW_MATRIX,第3 个变换完成GL_PROJECTION_MATRIX

这些模型视图变换,对于我们通常想要应用的许多有趣的变换(例如,平移,缩放和旋转),当我们在齐次坐标中表示顶点时,恰好可以表示为矢量矩阵乘法.通常,顶点V = (x, y, z)在此系统中表示为(x, y, z, 1).

好.假设我们想要通过平移,旋转,然后平移来转换顶点V_local.每个变换可以表示为矩阵*,我们称之为T1,R1,T2.我们想将变换应用于每个顶点:V_view = V_local * T1 * R1 * T2.矩阵乘法是关联的,我们可以一劳永逸地计算M = T1 * R1 * T2.

这样,我们只需要将M传递给顶点程序,然后进行计算V_view = V_local * M.最后,典型的顶点着色器将顶点位置乘以单个矩阵.计算该矩阵的所有工作都是将对象从局部空间移动到剪辑空间的方式.

好的......我浏览了一些重要的细节.

首先,我到目前为止所描述的内容实际上只涵盖了我们通常想要进行的视图空间转换,而不是剪辑空间.但是,硬件期望顶点着色器的输出位置在该特殊剪辑空间中表示.没有重要数学就很难解释剪辑空间坐标,所以我会把它留下来,但重要的是将顶点带到剪辑空间的变换通常可以表示为相同类型的矩阵乘法.这就是旧的gluPerspective,glFrustum和glOrtho计算的东西.

其次,这是你应用于顶点位置的.变换法线的数学有些不同.这是因为你希望法线在变换后保持垂直于曲面(作为参考,它需要乘以一般情况下模型视图的反转置,但在许多情况下可以简化)

第三,您永远不会将4-D坐标发送到顶点着色器.一般来说,你通过3-D.OpenGL会将这些3-D坐标(或2-D,btw)转换为4-D坐标,以便顶点着色器不必添加额外的坐标.它扩展每个顶点以添加1作为w坐标.

因此......为了将所有这些重新组合在一起,对于每个对象,您需要根据要应用于对象的所有变换来计算这些魔术M矩阵.在着色器内部,您必须将每个顶点位置乘以该矩阵,并将其传递给顶点着色器位置输出.典型的代码或多或少(这是使用旧的命名法):

mat4 MVP;
gl_Position=MVP * gl_Vertex;

*实际的矩阵可以在网上找到,特别是在每个功能的手册页上:旋转,平移,缩放,透视,正射

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有