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

glPushMatrix()/ glPopMatrix()不会影响混合状态.为什么是这样?

glPushMatrix()和glPopMatrix()是OpenGL中的两个函数,用于保存和恢复矩阵堆栈中的当前矩阵。

glPushMatrix()函数将当前矩阵压入堆栈,保存当前矩阵的副本。而glPopMatrix()函数则从堆栈中弹出矩阵,将其恢复为当前矩阵。

这两个函数主要用于OpenGL中的矩阵变换操作,例如平移、旋转和缩放等。它们的作用是在进行一系列矩阵变换操作时,可以将当前矩阵保存在堆栈中,然后在需要的时候恢复为之前的状态,以便进行下一组矩阵变换操作。

然而,glPushMatrix()和glPopMatrix()函数并不会直接影响混合状态。混合状态是OpenGL中的一个状态,用于控制颜色混合的方式和参数。它与矩阵堆栈无关,而是通过其他函数(例如glBlendFunc()和glBlendEquation())来设置和控制。

因此,glPushMatrix()和glPopMatrix()函数不会直接影响混合状态。它们的主要作用是在进行矩阵变换时,方便地保存和恢复当前矩阵的状态,而不会对其他OpenGL状态(如混合状态)产生直接影响。

推荐的腾讯云相关产品和产品介绍链接地址:

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

相关·内容

glPushMatrixglPopMatrix的作用

大家好,又见面了,我你们的朋友全栈君。 glPushMatrixglPopMatrix操作其实就相当于栈里的入栈和出栈。   许多人不明白的可能入的是什么,出的又是什么。...这时就调用glPopMatrix从栈里取出一个“状态”了,这个状态就是你调用glPushMatrix之前的那个状态。.../现在(1,1,0)了 glPopMatrix();//这样,现在又回到(1,0,0)了 1.原理讲解 终于明白为什么使用glPushMatrix()和glPopMatrix()的原因了。...将本次需要执行的缩放、平移等操作放在glPushMatrixglPopMatrix之间。glPushMatrix()和glPopMatrix()的配对使用可以消除上一次的变换对本次变换的影响。...(); // 将此句注释掉后可以发现上一次的变换结果对当前变换有影响,加上了glPushMatrix的目的让各次变换相互独立。

44330

OpenGL透明与混色效果

一、理论讲解 在OpenGL中,物体透明技术通常被叫做混合(Blending)。 透明物体(或物体的一部分)非纯色而是混合色,这种颜色来自于不同浓度的自身颜色和它后面的物体颜色。...alpha颜色值一个颜色向量的第四个元素,当alpha值0.0时就表示物体完全透明的,alpha值为0.5时表示物体的颜色由50%的自身的颜色和50%的后面的颜色组成。...要使用OpenGL的混合功能,只需要调用:glEnable(GL_BLEND);即可;要关闭OpenGL的混合功能,只需要调用:glDisable(GL_BLEND);即可。..., 100.0); glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); glEnable(GL_BLEND); //启用混合状态...1.0f, 0.0f, 0.5); glutSolidSphere(2.0f, 30.0f, 30.0f);//绘制球体 } glPopMatrix(); glPushMatrix

1.6K70

OpenGL的glPushMatrix()和glPopMatrix()矩阵栈顶操作函数详解「建议收藏」

opengl中的变换一般包括视图变换、模型变换、投影变换等,在每次变换后,opengl将会呈现一种新的状态(这也就是我们为什么会成其为状态机)。...当经过一系列的变换后,栈顶矩阵被修改,此时调用glPopMatrix()时,栈顶矩阵被弹出,且又会恢复为原来的状态。 函数的作用过程可以用下图描述,更为直观。...所以在场景中存在多种矩阵变换时,glPushMatrix()和glPopMatrix()一般情况下也要结合glMatrixMode(GLenum mode)运用,系统才知道具体操作的哪个矩阵栈。...其实摄像机和模型矩阵本质上一回事(这也是为什么OpenGL把这两个矩阵放在一起保存的原因),因为比如把整个世界向y+方向移动10跟把摄像机向y-方向移动10等价的。...这样来看把model和view放在一起合理的。他们之间的区别纯粹人为的。

1.3K30

机械版CG 实验3 变换参考实例

z)        glRotatef((GLfloat) shoulder, 0.0f, 0.0f, 1.0f);//用旋转矩阵乘当前矩阵,格式为glRotatef (角度,x轴,y轴,z轴),这里绕...();        glScalef(2.0f, 0.4f, 1.0f);        glutWireCube(1.0f);        glPopMatrix();        glPopMatrix...display()中用到了glPushMatrix()和glPopMatrix(),事实上glPushMatrix()可以理解为建立一个局部坐标系,glPopMatrix()恢复全局坐标系,它们可以嵌套使用...glutWireCube()画的一个线框的Cube,这样的函数还有 void glutWireSphere(GLdouble radius, GLint slices, GLint stacks);...,由于display()不断被调用的,所以你的视点被不断改变.还有一个方法可以改变视点,函数     gluLookAt(eye_x, eye_y, eye_z, centerx, centery,

42810

opengl 中glpushmatrixglpopmatrix函数的个人理解「建议收藏」

大家好,又见面了,我你们的朋友全栈君。最近在学习opengl,看到视图部分,感觉十分抽象,尤其各种矩阵变换,头大。在网上看了很多高手们的文章,感觉稍微有点眉目,就把自己的理解写出来。...本篇先谈一下glpushmatrixglpopmatrix这两个函数吧。 opengl中的坐标变换,总是针对当前矩阵,如果当前矩阵为M,紧跟的变换矩阵为I,则执行完I后,当前矩阵变为M*I。...一个方法把当前矩阵M*I/I,但这样做不仅麻烦,而且还会遇到其它问题;另一种方法就是我们把状态M保存下来,但需要的时候再调出来,这时就该glpushmatrixglpopmatrix上场了。...假设有一个存放矩阵变换的堆栈,当前矩阵为M,使用glpushmatrix将当前矩阵M的副本M1压入栈顶,当前矩阵变为M1=M,当执行下一步的矩阵变换I后,当前矩阵变为M1*I,执行完相应的绘画功能后,我们希望下一步的操作的当前矩阵为...M,使用glpopmatrix将当前矩阵M1*I弹出栈顶,M称为栈顶矩阵,也就是当前矩阵。

42420

OpenGl 实现鼠标分别移动多个物体

glutMouseFunc( (void*)Func(int button, int state, int x, int y) ); glutMouseFunc这个调用鼠标函数的入口,func我们给鼠标处理函数的命名...比如: // 鼠标运动时 void onMouseMove(int x, int y) { //当鼠标状态为按下时进入后续判断 if (mousetate) { //x对应...还有鼠标的滚轮事件 GLUT_WHEEL_UP   GLUT_WHEEL_DOWN 这两个可能有时候会遇到自己gult库没有定义,那么就是版本比较老的缘故,不想麻烦下新版本或者下了新版本还是没有解决的话就直接像这样定义在文件头部...movX1 = (x - x1) / width1;   垂直方向上,同理可得movY1 = -((y - Y1) / height1);  为什么这里多个负号,是因为向下移动负数,向上正数。...glPushMatrix(); glColor3f(0, 1, 0); glTranslatef(movX2, movY2, 0); DrawCube(); glPopMatrix

2.6K20

实验5 OpenGL模型视图变换

设置的方法是以GL_MODELVIEW为参数调用glMatrixMode函数,像这样: glMatrixMode(GL_MODELVIEW); 该语句指定一个4×4的建模矩阵作为当前矩阵。...当我们需要保存时,调用glPushMatrix()函数,它相当于把当前矩阵压入堆栈。当需要恢复最近一次的保存时,调用glPopMatrix()函数,它相当于从堆栈栈顶弹出一个矩阵为当前矩阵。...(2)使用模型变换的目的设置模型的位置和方向 (3)投影变换,指定投影变换类似于为照相机选择镜头,可以认为这种变换的目的确定视野,并因此确定哪些物体位于视野之内以及他们能够被看到的程度。...除了考虑视野之外,投影变换确定物体如何投影到屏幕上,OpenGL提供了两种基本类型的投影,1、透视投影:远大近小;2、正投影:不影响相对大小,一般用于建筑和CAD应用程序中 (4)视口变换 视口变换指定一个图象在屏幕上所占的区域...提示:使用glPushMatrix()和glPopMatrix()在适当的时候保存和恢复坐标系统的位置。

1.6K30

Python实现3D建模工具(上)

虽然说是坐标系变换,其实只要认为坐标系“固定不动”的,就可以看成坐标系中的物体在坐标系中变换了。移动、旋转、缩放被称作仿射变换,其对应矩阵就是令物体在坐标系中变换使用的。...也许你会奇怪为什么有的坐标使用的三元组有的坐标使用的四元组,三元组还可以理解,四元祖怎么回事呢?...() #每次渲染后复位光照状态 glDisable(GL_LIGHTING) glPopMatrix() #把数据刷新到显存上 glFlush() def...为什么球形类与节点类之间又多了一个Primitive类呢?primitive又称作图元,在这里,它是组成模型的基本单元,像是球体,立方体,三角等都属于图元。...() #每次渲染后复位光照状态 glDisable(GL_LIGHTING) glCallList(G_OBJ_PLANE) glPopMatrix

6000

opengl入门教程pdf

在Windows下,以glGenBuffers为例,大概这样的: #include #include ... // define the functions...所有在范围外的坐标不会被映射到在−1.0 −1.0到1.0 1.0的范围之间,所以会被裁剪掉。...参数components一个从1到4的整数,指出选择了R、G、B、A中的哪些分量用于调整和混合,1表示选择了R分量,2表示选择了R和A两个分量,3表示选择了R、G、B三个分量,4表示选择了R、G、B、...对于较光滑物体,其镜面反射光的高光区域小而亮;相反,粗糙表面的镜面反射光呈发散状态,其高光区域大而不亮。...辐射光是最简单的一种光,它直接从物体发出并且不受任何光源影响。 环境光是由光源发出经环境多次散射而无法确定其方向的光,即似乎来自所有方向。

3.1K30

【OpenGL】二十一、OpenGL 矩阵压栈与出栈 ( 不同类型矩阵变换先后顺序 | 渲染前不设置单位阵 | 压栈出栈原理分析 | 代码示例 )

// 每个参数都影响 x , y , z 分量 //glScalef(2.0f, 2.0f, 1.0f); // 矩阵旋转 // glRotatef (GLfloat angle,...(); 矩阵出栈 : // 矩阵出栈 glPopMatrix(); 三、矩阵的压栈和出栈原理分析 ---- 这里引入两个重要的操作 : 矩阵的 压栈 和 出栈 , 这是 OpenGL 固定管线中的重要操作...主对角线元素 1 , 其它位置都是 0 ) ; 矩阵压栈 : 调用 GLPushMatrix 方法进行压栈时 , 会将栈顶的矩阵拷贝一份 , 然后放在栈顶 , 原来的模型视图矩阵 , 就处于栈顶的下方位置...(); // 矩阵缩放 // 缩放的下面设置的点的坐标 // 每个参数都影响 x , y , z 分量 //glScalef(2.0f, 2.0f, 1.0f); // 平移变换..., 0, 255, 255); glVertex3f(1.0f, 0.0f, -5.0f); // 绘制三角形结束 glEnd(); // 矩阵出栈 glPopMatrix

1.8K00

Python实现3D建模工具(下)

#Python实现3D建模工具 ###用户接口 我们希望与场景实现两种交互,一种你可以操纵场景从而能够从不同的角度观察模型,一种你拥有添加与操作修改模型对象的能力。...感观上这样,但其实这种说法不准确,真实情况在世界坐标系里摄像机在原点的,但在摄像机坐标系中,摄像机后退了15个单位,这就等价于前者说的那种情况了。...这样做的好处就是对于不同形状的对象你都可以使用同一段代码处理选中判定,并能保证较好的性能。...新建aabb.py,编写包围盒类: from OpenGL.GL import glCallList, glMatrixMode, glPolygonMode, glPopMatrix, glPushMatrix...在性能,代码复杂度与功能准确度之间之间进行衡量与抉择在计算机图形学与软件工程中常常会遇见的。

11710

【OpenGL】二十二、OpenGL 光照效果 ( 模型准备 | 光照设置 | 启用光照 | 启用光源 | 设置光源位置 | 设置光照参数 | 设置环境光 | 设置反射材质 | 设置法线 )

DispatchMessage(&msg); } // 渲染场景 // 设置单位矩阵 glLoadIdentity(); // 矩阵压栈 //glPushMatrix...(); // 矩阵缩放 // 缩放的下面设置的点的坐标 // 每个参数都影响 x , y , z 分量 //glScalef(2.0f, 2.0f, 1.0f); // 矩阵旋转...255, 255); glVertex3f(0.0f, -0.5f, -10.0f); // 绘制三角形结束 glEnd(); // 矩阵出栈 //glPopMatrix...(); // 矩阵缩放 // 缩放的下面设置的点的坐标 // 每个参数都影响 x , y , z 分量 //glScalef(2.0f, 2.0f, 1.0f); // 矩阵旋转...255, 255); glVertex3f(0.0f, -0.5f, -10.0f); // 绘制三角形结束 glEnd(); // 矩阵出栈 //glPopMatrix

50700

OpenGl 导入读取多个3D模型 并且添加鼠标控制移动旋转

o 引入一个新的object     v 表示顶点位置     vt 表示顶点纹理坐标     vn 表示顶点法向量     f 表示一个面,面使用1/2/8这样格式,表示顶点位置/纹理坐标/法向量的索引...还有鼠标的滚轮事件 GLUT_WHEEL_UP   GLUT_WHEEL_DOWN 这两个可能有时候会遇到自己gult库没有定义,那么就是版本比较老的缘故,不想麻烦下新版本或者下了新版本还是没有解决的话就直接像这样定义在文件头部...YU); // 右下 glEnd(); // 三角形绘制结束 } glPopMatrix...YU); // 右下 glEnd(); // 三角形绘制结束 } glPopMatrix...movX1 = (x - x1)  / 2 * 5;   垂直方向上,同理可得movY1 = -((y - Y1) / 2 * 5);  为什么这里多个负号,是因为向下移动负数,向上正数。

3K30

用OpenGL绘制平滑着色的三角形与相交区域的混合着色

参数face指定多边形的哪一面受模式改变的影响——GL_FRONT,GL_BACK或GL_FRONT_AND_BACK。 参数mode用于指定新的绘图模式。...GL_FILL默认值,生成填充的多边形;GL_LINE生成多边形的轮廓;而GL_POINT只画出顶点。 GL_LINE和GL_POINT绘制的点和线受glEdgeFlag所设置边缘标记的影响。...六、相交区域的混合着色 glBlendFunc( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ); // 最常使用的。...七、混合 3D 物体 混合 3D 物体时,基本原理和混合 2D 物体一样,但需要将深度检测关闭或设置为只读。 因为深度检测会剔除被遮挡的部分物体。...0.0f,0.0f,1.0f); } //显示函数:绘制几何体的命令 void display() { //清除背景 glClear(GL_COLOR_BUFFER_BIT); glPushMatrix

2.1K110

用OpenGL进行曲线、曲面的绘制

B样条的工作方式类似于贝塞尔曲线,但不同的曲线被分成很多段。每段曲线的形状只受到最近的四个控制点的影响这样曲线就像是4阶的贝塞尔曲线拼接起来的。...这样很长的有很多控制点的曲线就会有固定的连续性,平滑性(每一段都是c2级的连续性)。...结点的取值范围u或v的定义域,而且必须是非递减的。   结点的值决定了落在u、v参数定义域内的控制点的影响力。下图的曲线表示控制点对一条在u参数定义域内的具有四个单位的曲线的影响。...下图表示中间点对曲线的影响更大,而且只有在[0,3]范围内的控制点才会对曲线产生影响。 ?  在u、v参数定义域内的控制点对曲线的形状会有有影响,而且我们可以通过结点来控制控制点的影响力。...非均匀性就是指一个控制点的影响力的范围可以改变的。 节点 ( Knot ) 一个 ( 阶数 + N - 1 ) 的数字列表,N 代表控制点数目。

2.9K70

实验6 OpenGL模型视图变换

上述变换在OpenGL中实际上通过矩阵乘法来实现。无论移动、旋转还是缩放大小,都是通过在当前矩阵的基础上乘以一个新的矩阵来达到目的。OpenGL可以在最底层直接操作变换矩阵。...,这个空间里物体将以正投影的模式表现,在移动的过程中,观察到的物体大小不会发生变化,这解释了为什么在正投影中移动物体,不能观察出物体形状变化;   (4)gluPerspective(视角,宽高比,近距离...false;//填充、线框 int wHeight = 0; int wWidth = 0; float place[] = { 0, 0, 5 }; void Draw_Scene() { glPushMatrix...0); //茶壶绕x轴旋转的角度 glRotatef(tRotate, 0, 1, 0); glScalef(1.8,1.8, 1.8); glutSolidTeapot(5);//size glPopMatrix...glutKeyboardFunc(myKey);//为当前窗口指定键盘回调 glutIdleFunc(myIdle);//可以执行连续动画 glutMainLoop();//进入glut时间处理循环,永远不会返回

2K30
领券