首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

现代OpenGL:我应该使用自定义矩阵堆栈吗?

现代OpenGL是一个用于图形渲染的开放式图形库。在现代OpenGL中,自定义矩阵堆栈已经被弃用,不再建议使用。相反,推荐使用自定义的数学库来处理矩阵运算。

使用自定义矩阵堆栈的主要目的是在渲染过程中跟踪和管理变换矩阵。然而,自定义矩阵堆栈的实现通常会导致性能问题,并且在现代OpenGL中已经被更高效的方法所取代。

现代OpenGL推荐使用自定义的数学库,例如GLM(OpenGL Mathematics),它提供了一套功能强大的数学函数和矩阵操作。使用GLM,您可以轻松地创建、操作和传递矩阵,而无需使用矩阵堆栈。

GLM提供了各种矩阵和向量操作,包括平移、旋转、缩放等。您可以使用GLM创建和操作模型矩阵、视图矩阵和投影矩阵,以实现各种变换效果。

使用自定义数学库的优势包括更高的性能、更灵活的矩阵操作和更好的代码可读性。此外,GLM与现代OpenGL紧密集成,可以无缝地与其他OpenGL函数和特性配合使用。

对于现代OpenGL中的矩阵操作,您可以参考GLM的官方文档和示例代码,链接如下:

GLM官方文档:https://github.com/g-truc/glm

GLM示例代码:https://github.com/g-truc/glm/tree/master/test

总结:在现代OpenGL中,不建议使用自定义矩阵堆栈,而是推荐使用自定义的数学库,如GLM,来处理矩阵运算。这样可以获得更高的性能、更灵活的操作和更好的代码可读性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

应该使用 PyCharm 在 Python 中编程

此外,它可以在多种平台上使用,包括Windows,Linux和macOS。...此外,它对于使用流行的Web应用程序框架(如Django和Flask)进行Web开发特别有用。此外,程序员还可以使用各种API创建他们的Python插件。...此外,它拥有一个用户友好的界面,可以使用特定应用程序的插件进行自定义。 集成工具 PyCharm是用于Python开发的集成开发环境(IDE),它提供了广泛的集成工具,允许您使用各种其他技术和工具。...可自定义的用户界面 - PyCharm允许您自定义IDE的外观以满足您的偏好,包括更改界面的配色方案,字体和布局的能力。...但是,您是否应该使用它取决于您的特定需求和偏好。如果您不熟悉编程或更喜欢简单的文本编辑器,则可能需要从更基本的工具开始。但是,如果您正在处理大型项目或需要高级功能,PyCharm可能是您的最佳选择。

4.6K30

实验5 OpenGL模型视图变换

(视口变换) 这些,都可以在OpenGL中实现。 从“相对移动”的观点来看,改变观察点的位置与方向和改变物体本身的位置与方向具有等效性。在OpenGL中,实现这两种功能甚至使用的是同样的函数。...当我们需要保存时,调用glPushMatrix()函数,它相当于把当前矩阵压入堆栈。当需要恢复最近一次的保存时,调用glPopMatrix()函数,它相当于从堆栈栈顶弹出一个矩阵为当前矩阵。...OpenGL规定堆栈的容量至少可以容纳32个矩阵,某些OpenGL实现中,堆栈的容量实际上超过了32个。因此不必过于担心矩阵的容量问题。...注意:模型视图矩阵和投影矩阵都有相应的堆栈使用glMatrixMode来指定当前操作的究竟是模型视图矩阵还是投影矩阵。...1.display()程序中绘图函数潜在的重复性强调了:在指定的视图变换之前,应该使用glLoadIdentity()函数把当前矩阵设置为单位矩阵

1.6K30
  • OpenGL基本框架与三维对象绘制

    stdio.h> #include #include #define PI 3.1415926 //金字塔初始旋转角度 GLfloat rtri = 0; //用户自定义三维空间的齐次坐标矩阵...(4X4)——用于输出查看变化矩阵的变化 typedef float Mat44[16]; //自定义初始化opengl 环境 void init(void) { //设置背景色——用于填充背景...void glCircle() { double n=50;//分段数 float R=1.0;//半径 int i; //将绘图前的模型变换矩阵压入堆栈 glPushMatrix...//这样,对当前图形的变换对后面图形绘制不影响 glPopMatrix(); } //opengl 用户自定义绘图函数 void display(void) { //清除颜色缓存和深度缓存...0.0f, 0.0f, 0.5); glutSolidTorus(0.3, 0.7, 30.0f, 30.0f);//绘制实心圆环 } glPopMatrix(); //从堆栈中恢复已压栈的变换矩阵

    73420

    glPushMatrix和glPopMatrix的作用

    就如很多opengl的书上所讲:调用glPushMatrix其实就是把当前状态做一个副本放入堆栈之中。...当你做了一些移动或旋转等变换后,使用glPushMatrix(); OpenGL 会把这个变换后的位置和角度保存起来。...因为所有矩阵操作函数如glLoadMatrix()、glMultMatrix()、glLoadIdentity()等只处理当前矩阵堆栈顶部矩阵,这样堆栈中下面的其它矩阵就不受影响。...第二个函数表示弹出堆栈顶部的矩阵,令原第二个矩阵成为顶部矩阵,接受当前操作,故原顶部矩阵被破坏;当堆栈中仅存一个矩阵时,不能进行弹出操作,否则出错。...由此看出,矩阵堆栈操作与压入矩阵的顺序刚好相反,编程时要特别注意矩阵操作的顺序。

    48230

    投影矩阵 视图模型矩阵「建议收藏」

    大家好,又见面了,是你们的朋友全栈君。...OpenGL在设置场景时,要用到两个矩阵:投影矩阵 和 模型视图矩阵通过glMatrixMode来指定下面的矩阵操作是针对哪一个矩阵进行的。...gluLookatup,glTranslate, glRotate, glScale, glOrtho ,gluPerspective 等函数只根据其参数计算出一个矩阵M,然后与当前的栈顶元素T相乘;但这些函数本身不能自动找到应该对应的矩阵堆栈...,你可以将它们放在任何矩阵堆栈操作中,比如可以将gluLookatup放在glMatrixMode(GL_PROJECTION)的后面,则视点矩阵与投影矩阵堆栈的当前栈顶元素相乘得到一个新的投影矩阵,这样在某些情况下也可以得到正确的结果...(OpenGL为列主序矩阵,转置) 但可以在绘图之前的任何时候执行投影变换和视口变换。 视锥体的设置: 投影变换创建了一个六面体,位于视锥体内的模型才能被看到,而外面的模型则被裁剪掉。

    50720

    实验5 OpenGL二维几何变换

    3.实验原理: (1) OpenGL下的几何变换 在OpenGL的核心库中,每一种几何变换都有一个独立的函数,所有变换都在三维空间中定义。...(视口变换) 这些,都可以在OpenGL中实现。 从“相对移动”的观点来看,改变观察点的位置与方向和改变物体本身的位置与方向具有等效性。在OpenGL中,实现这两种功能甚至使用的是同样的函数。...当我们需要保存时,调用glPushMatrix()函数,它相当于把当前矩阵压入堆栈。当需要恢复最近一次的保存时,调用glPopMatrix()函数,它相当于从堆栈栈顶弹出一个矩阵为当前矩阵。...OpenGL规定堆栈至少可以容纳32个矩阵,某些OpenGL实现中,堆栈的容量实际上超过了32个。因此不必过于担心矩阵的容量问题。 通常,用这种先保存后恢复的措施,比先变换再逆变换要更方便、更快速。...注意:模型视图矩阵和投影矩阵都有相应的堆栈使用glMatrixMode来指定当前操作的究竟是模型视图矩阵还是投影矩阵

    2.4K10

    OpenGL API 简介

    glPushMatrix(),矩阵出栈函数 glPopMatrix(),装载矩阵函数 glLoadMatrix(),矩阵相乘函数 glMultMatrix(),当前矩阵函数 glMatrixMode()...扩展源由扩展函数的后缀来指明(或使用扩展常量后缀)。例如,后缀 WIN 表明一个符合 Windows 规范的扩展,EXT或 ARB 后缀表明该扩展由多个卖主定义。...ARB 扩展,应该优先使用 ARB 扩展; • EXT – 多家 OpenGL 厂商同意支持的扩展; • HP – Hewlett-Packard 惠普; • IBM – International...glLoadMatrixd,glLoadMatrif 用一个任意矩阵替换当前矩阵 glLoadName 将一个名字调入名字堆栈 glLogicOp 为色彩索引渲染定义一个逻辑像素操作 glMap1d...glPushClientAttrib,glPopClientAttrib 在客户属性堆栈存储和恢复客户状态值 glPushmatrix,glPopMatrix 矩阵堆栈的压入和弹出操作 glPushName

    2.2K41

    opengl 中glpushmatrix和glpopmatrix函数的个人理解「建议收藏」

    大家好,又见面了,是你们的朋友全栈君。最近在学习opengl,看到视图部分,感觉十分抽象,尤其是各种矩阵变换,头大。在网上看了很多高手们的文章,感觉稍微有点眉目,就把自己的理解写出来。...opengl中的坐标变换,总是针对当前矩阵,如果当前矩阵为M,紧跟的变换矩阵为I,则执行完I后,当前矩阵变为M*I。...但有些时候,我们想在这一步操作中使用当前矩阵M*I,但是在下一步操作中使用当前矩阵为M。...假设有一个存放矩阵变换的堆栈,当前矩阵为M,使用glpushmatrix将当前矩阵M的副本M1压入栈顶,当前矩阵变为M1=M,当执行下一步的矩阵变换I后,当前矩阵变为M1*I,执行完相应的绘画功能后,我们希望下一步的操作的当前矩阵为...M,使用glpopmatrix将当前矩阵M1*I弹出栈顶,M称为栈顶矩阵,也就是当前矩阵

    48920

    实验4 二维几何变换

    2.实验内容: 根据示范代码1,使用OpenGL平移、旋转、缩放变换函数来改写代码实现所要求的功能。示范代码1的代码运行结果为图1。...(视口变换) 这些,都可以在OpenGL中实现。 从“相对移动”的观点来看,改变观察点的位置与方向和改变物体本身的位置与方向具有等效性。在OpenGL中,实现这两种功能甚至使用的是同样的函数。...当我们需要保存时,调用glPushMatrix()函数,它相当于把当前矩阵压入堆栈。当需要恢复最近一次的保存时,调用glPopMatrix()函数,它相当于从堆栈栈顶弹出一个矩阵为当前矩阵。...OpenGL规定堆栈至少可以容纳32个矩阵,某些OpenGL实现中,堆栈的容量实际上超过了32个。因此不必过于担心矩阵的容量问题。 通常,用这种先保存后恢复的措施,比先变换再逆变换要更方便、更快速。...注意:模型视图矩阵和投影矩阵都有相应的堆栈使用glMatrixMode来指定当前操作的究竟是模型视图矩阵还是投影矩阵。 (3) 某图形绕任意点(cx, cy)旋转 α\alphaα 角。

    1.1K20

    实验3 OpenGL几何变换

    2.实验内容: (1)阅读实验原理,运行示范实验代码,掌握OpenGL程序平移、旋转、缩放变换的方法; (2)根据示范代码,尝试完成实验作业; 3.实验原理: (1)OpenGL下的几何变换 在OpenGL...(视口变换) 这些,都可以在OpenGL中实现。 从“相对移动”的观点来看,改变观察点的位置与方向和改变物体本身的位置与方向具有等效性。在OpenGL中,实现这两种功能甚至使用的是同样的函数。...当我们需要保存时,调用glPushMatrix()函数,它相当于把当前矩阵压入堆栈。当需要恢复最近一次的保存时,调用glPopMatrix()函数,它相当于从堆栈栈顶弹出一个矩阵为当前矩阵。...OpenGL规定堆栈的容量至少可以容纳32个矩阵,某些OpenGL实现中,堆栈的容量实际上超过了32个。因此不必过于担心矩阵的容量问题。...注意:模型视图矩阵和投影矩阵都有相应的堆栈使用glMatrixMode来指定当前操作的究竟是模型视图矩阵还是投影矩阵

    1.2K20

    OpenGL (二)--OpenGL中那些晦涩难懂的名词、动词解析OpenGL (二)--OpenGL中那些晦涩难懂的名词、动词解析

    基于GPU的特性(图形运算单元):擅长通过并行的方式来进行数学计算,让想起了为什么要使用GPU来进行比特币的“挖矿”操作了。 所以将逻辑计算交给CPU,将图像运算交给GPU。...这一系列过程叫做渲染,理解应该是一个动词。 图元 首先需要明确一个概念图元,在OpenGl中图元包含:点、线、三角形。也就是说我们看到的任何图形都是由这三个基本元素组成的。...就是可以供开发者可以使用GLSL自定义一些着色器,其实也只有:顶点着色器、片元着色器 顶点着色器 可以自定义开发的着色器,可以将顶点信息进行编程。...OpenGL中已经提供了一些固定的混合算法,但是平时开发中也会使用自定义片元着色器来完成,但是效率会比固定混合算法差一些。...变换矩阵OpenGL中想要图形发生平移、缩放、旋转就需要变换矩阵进行计算。 投影矩阵OpenGL中想要3D坐标转换为2D坐标,就需要投影矩阵进行计算。

    1.1K20

    【C++】OpenGL:计算机图形学OpenGL基础及环境配置

    4.二维和三维图形:OpenGL 支持绘制和处理2D和3D图形。它提供了基本的几何图元(如点、线、三角形),以及矩阵变换和投影等功能,使开发者能够创建复杂的图形场景。...开发者可以使用 GLSL(OpenGL Shading Language)编写自定义的着色器程序。 6.扩展性:OpenGL 具有可扩展性,支持各种扩展功能和特性。...当使用OpenGL的核心模式时,OpenGL迫使我们使用现代的函数。...现代函数要求使用者真正理解OpenGL和图形编程,它有一些难度,然而提供了更多的灵活性,更高的效率,更重要的是可以更深入的理解图形编程。...使用扩展的代码大多看上去如下: if(GL_ARB_extension_name) { // 使用硬件支持的全新的现代特性 } else { // 不支持此扩展: 用旧的方式去做 } 状态机

    1.2K10

    实验6 OpenGL模型视图变换

    上述变换在OpenGL中实际上是通过矩阵乘法来实现。无论是移动、旋转还是缩放大小,都是通过在当前矩阵的基础上乘以一个新的矩阵来达到目的。OpenGL可以在最底层直接操作变换矩阵。...同时,OpenGL也把这一切变换封装成一系列函数调用来实现不同的变换,以便于使用。   ...下面是这些变换函数使用时需要注意内容:   (1)在OpenGL程序中,视图变换必须出现在模型变换之前,但可以在绘图之前的任何时候执行投影变换和视口变换。   ...(2)确定视图变换之前,应该使用glLoadIdentity函数把当前矩阵设置为单位矩阵,类似于变换初始化。   (3)在载入单位矩阵之后,使用gluLookAt函数指定视图变换。...物体近大远小,参数分别为(视角,宽高比,近处,远处) else glOrtho(-3, 3, -3, 3, -100, 100); glMatrixMode(GL_MODELVIEW);//对模型视景矩阵堆栈应用随后的矩阵

    2.1K30

    矩阵运算_逆矩阵的运算

    下面就是一个矩阵的实例: 看似没什么特殊的,可是后面你可以看到矩阵的魅力,为什么矩阵这么有效,也不知道,这个由数学家去论述,我们只要可以用就是了。 2....这时候就必须使用矩阵来解决这些问题。...矩阵中的数据排列可以使用矩阵,也可以使用矩阵,但在做乘法时必须要行列交叉做乘积,OPENGL使用矩阵。...在OPENGL中常使用glLoadIdentity()函数来设置单位矩阵,由于OPENGL是状态机,所以每次绘制场景前都用来重置之前可能被修改过的矩阵,但是有时绘制一个模型必须在之前的计算结果上进行坐标变换...但是由于大多数情况,OPENGL矩阵堆栈深度为32,即只能保存32个矩阵,虽然矩阵堆栈其效率比较快,但是在某些场合32个矩阵是不够的,为了减少计算机运算负载,必须事先安排好绘制顺序,这也是进行类封装的必要性

    1.5K40

    OpenGL矩阵变换的数学推导

    说起OpenGL矩阵变换,是之前在我们的项目天天P图、布丁相机中开发3D效果时才比较深入地研究了其中的原理,一直想写这篇文章,由于很忙(lǎn),拖了很久,再不写自己也要忘了。...什么是OpenGL矩阵变换 我们先来看一张经典图: 这张图相信很多同学在学习OpenGL的过程中都看到过,它比较直观地展示了OpenGL矩阵变换的过程,下面详解一下其中的含义: 首先OpenGL有个世界坐标系...还没有,大家可以想像一下,把一个东西放在世界坐标系的某个地方,可以从近处看观察它,也可以从远处观察它,还可以从上下左右观察它,甚至还可以倒着观察它,因些还需要确定我们观察它的状态。...假设我们不动摄像机,动坐标点,那么对坐标点的变换就应该是对相机变换的逆变换T^-1R^-1(就是对TR整体求逆矩阵),注意,这里的T^-1R^-1看起来貌不惊人,实际上就是我们要求的View Matrix...xn和yn

    1.1K30

    OpenGL(九)-- 综合案例(公、自转)OpenGL(九)-- 综合案例(公、自转)

    OpenGL(九)-- 综合案例(公、自转) 相信学习过OpenGL的同学应该过玩过这个经典案例: ?...(三)--一个"HelloWorld"的执行全过程,也可以直接下载源码来看github 下面就按照这个顺序贴上代码+个人理解: 全局属性 //投影视图矩阵堆栈 GLMatrixStack projectMatrix...; //模型视图矩阵堆栈 GLMatrixStack modelViewMatrix; //mvp变换管道 GLGeometryTransform transform; //固定着色器管理类 GLShaderManager...时刻记着:OpenGL是一个巨大的状态机。OpenGL没有对象的概念,是面向过程的编程方式,根据代码执行的顺序完成赋值操作。...对于压栈、出栈在OpenGL(五)-- OpenGL矩阵的变换会有详细的解释。

    1.1K40

    OpenGL矩阵变换的数学推导

    说起OpenGL矩阵变换,是之前在我们的项目天天P图、布丁相机中开发3D效果时才比较深入地研究了其中的原理,当时一开始时,也只是知道怎么去用这些矩阵,却不知道这些矩阵是怎么得来的,当出现一些莫名其妙的问题时...什么是OpenGL矩阵变换 我们先来看一张经典图: [g19314w146.jpeg] 这张图相信很多同学在学习OpenGL的过程中都看到过,它比较直观地展示了OpenGL矩阵变换的过程,下面详解一下其中的含义...假设我们不动摄像机,动坐标点,那么对坐标点的变换就应该是对相机变换的逆变换R^-1T^-1(就是对TR整体求逆矩阵),注意,这里的R^-1T^-1看起来貌不惊人,实际上就是我们要求的View Matrix...,还记得前面计算的xn和yn?...还记得括号外面乘了一个因子(-1/z0)

    6.5K62

    Camera开发需要关注哪些点

    学习音视频的同学应该很熟悉这种模式,视频解码一帧放入队列,然后另外一个线程分别从这个队列中取出帧,想之所以这样设置也是为了异步处理。...Camera主要功能 我们使用Camera,主要为了实现什么功能?下面列出了一个相机应用所应该支持的功能,我们接下来的分享中也是会挑一些重点来讲解一下。...实现一个相机应用,需要结合OpenGL实现渲染绘制,OpenGL通过矩阵运算可以将相机帧以特定的比例映射到渲染画布上,使用OpenGL处理的好处还有后期兼容滤镜、特效等画面处理非常方便。...TextureView/SurfaceView/GLSurfaceView 相机的画布可以使用TextureView、SurfaceView、GLSurfaceView三种,之前写过一篇比较TextureView...创建三个矩阵:正交矩阵、观察矩阵、位移矩阵可以监察相机中物体最终的移动变换。

    73510

    OpenGL ES 投影和坐标

    接下来,我们需要找到某种可以把虚拟空间坐标转化回归依化设备坐标的方法,让OpenGL可以正确的渲染它们。这种转换应该把屏幕方向计算在内,以使图像在竖屏模式和横屏模式看上去都一样。...4.线性代数基础 OpenGL大量使用了向量和矩阵矩阵的最重要的用途之一就是建立正交和透视投影。...其原因之一是,从本质上来说,使用矩阵做投影只涉及对一组数据按顺序执行大量的加法和乘法,这些运算在现代GPU上执行的非常快。 4.1向量 一个向量是一个有多个元素的一维数组。...当我们调用这个方法的时候,它应该产生下面的正交投影矩阵: ?...归一化设备坐标使用的是左手坐标系统,而在OpenGL的早期版本,默认使用的确实右手坐标系统,其使用Z的负值增加表示距离增加。这就是为什么Android的Matrix会默认生成反转Z的矩阵

    1K30
    领券