OpenGL图形学
文章平均质量分 83
FreedomRoad~
专注于app底层/架构/算法/业务工作流程,记录进步的足迹和感悟。
展开
-
切线空间法线贴图生成和应用的理解
一、基于切线空间坐标系的法线贴图理解:使用法线贴图是因为在低模下想获得高模凹凸表面光照效果。因为基于模型坐标系的法线贴图,在换到不同的模型下时候法线贴图不能复用。故引入切线空间让法线贴图可以在相同网格形状模型(或许是子模型)但不同模型坐标系的多个模型间可以共享法线贴图。以下是我个人对切线空间求取,法线贴图求取,法线贴图计算光照的理解,不对之处欢迎指出:1)低模切线空间求取:假设:dp是网格上某三角...原创 2017-09-16 17:06:39 · 2662 阅读 · 0 评论 -
OpenGL状态机/变换堆栈/基本类型和函数
一、状态机理解Opengl是一个状态机,当你设置一个命令状态进去了以后会一直是这个状态,直到改变这个状态为止,实际中需要检查下当前状态再设置进去效率会高些,避免产生很多的OGL comand,这点和D3D一样。二、变换堆栈理解 Opengl矩阵堆栈变换类型分为模型视图变换GL_MODELVIEW堆栈和投影变换GL_PROJECTION堆栈,在指定的变换堆栈中,当前的变换都是右乘该原创 2015-09-27 20:12:23 · 1215 阅读 · 0 评论 -
从描述来求取变换(矩阵欧拉角四元数)的思想
从变换来求取变换矩阵,欧拉角,或四元数,首先需要明天矩阵,欧拉角,四元数的含义。然后用它们来描述人类理解的变换,对于矩阵变换的求取:1)用变换前坐标系作为参考坐标系,先取得一个变换前向量,然后取得一个变换后向量。2)通过相对于参考坐标系数值不变;数值对称取反;作垂线平分线于参考坐标系,假设转换为已知坐标轴关系例如旋转基向量求取;通过向量的点积投影和叉乘法向量,三角关系sin theta,c原创 2016-05-27 10:44:29 · 1241 阅读 · 0 评论 -
OGL多边形或二次曲面分格化(Tessellation曲面软件细分技术)
现在的光栅化图形渲染技术的核心是绘制大量三角形来组成3D模型,而Tessellation技术就是利用GPU硬件加速,将现有3D模型的三角形拆分得更细小、更细致,也就是大大增加三角形数量,使得渲染对象的表面和边缘更平滑、更精细。直到DX11时代,GPU自身的性能有了长足的进步,硬件上真正具备了细分曲面的实力,再加上微软重新改写API渲染流程,专为Tessellation开辟了新的着色器,这才让Tes原创 2016-10-08 09:10:57 · 2515 阅读 · 0 评论 -
OGL纹理特征和glTexImage2D gluScaleImage glCopyTextImage2D
glTexImage2D函数原型:glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);实例:glTexImage2D(原创 2016-08-24 10:21:34 · 1986 阅读 · 0 评论 -
OGL纹理之纹理过滤器和多级渐进纹理mipmap
纹理过滤器纹理图像映射到屏幕坐标系的图元中,很多时候不是和屏幕坐标系(像素)一一对应的,因此需要进行放大或缩小(尽量避免一个方向上放大一个方向上缩小,避免这个问题最好方法是不要使用扭曲的纹理坐标)以铺满对应的图元。纹理过滤器通过glTexParameteri函数来指定。1)放大纹理过滤器//GL_NEAREST最近点采样块有明显锯齿,GL_LINEAR线性过滤效果较好glTexPa原创 2016-08-29 10:48:14 · 2950 阅读 · 0 评论 -
OGL点参数圆形衰减/贴花/多边形偏移技术
OGL点参数1.可以用设置点图元达到想要的物体形状和光照效果。主要用:glPointParameterfv来设置: glPointParameterfv(GL_DISTANCE_ATTENUATION_EXT, linear);glPointSize (psize);#define GL_POINT_SIZE_MIN_EXT 0x8126 // 设置原创 2016-08-08 10:23:07 · 902 阅读 · 0 评论 -
OpenGL环境搭建(Windows下VS2010)和版本信息查询
环境搭建需要注意的:1.要自己去下载 glut3.7包(SDK非源码),解压,然后把glut32.dll的文件都放到windows/system32文件夹里面去;把glut32.lib放到VC的C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib文件夹里面;把glut.h头文件放到C:\Program Files\Microsoft S原创 2013-03-31 22:14:22 · 4565 阅读 · 0 评论 -
OGL编程中的错误处理汇总和优化编码流程感悟-持续更新
OGL编程错误处理汇总在处理OGL编码错误时候,大部分是调用不一致导致的(代码参数不一致,检查上下文和查看官方文档,弄清楚参数含义;头文件和库文件不一致,需要工具检查)。优化编码流程感悟在解决这些问题时候,需要敏锐的观察,分析,google, 更好的是提取出工作流程,例如Google C++编码规范中对构造和析构的宏定义,对于容易不一致的提供统一调用封装接口检查原创 2016-07-04 11:55:05 · 626 阅读 · 0 评论 -
OGL选择和反馈模式
选择和反馈模式基本知识渲染物体时候除了直接在屏幕上显示,还可以启用选择或反馈模式绘制物体但是不显示,得到一些绘图信息。选择模式只是表明那些物体和视景体相交,用挑选功能可以实现用户和绘制图元的交互。反馈模式是返回绘图信息,用于绘图仪的设备中。选择和反馈模式下,绘图信息都是直接返回给应用程序而不是像渲染模式一样将信息发送到帧缓存,所以在选择和反馈模式下屏幕冻结不会进行绘图,颜色,深度,原创 2016-10-16 09:54:19 · 1621 阅读 · 0 评论 -
使用GLU的NURBS绘制曲线和曲面(获取分格化图元和曲面修剪)
NURBS基本知识可以使用求值器描述任何角度的多项式或有理多项式样条或表面。他们几乎包含了如今所有常见的样条或样条表面,包括B-样条,NURBS(非均匀有理B-样条)表面,Bezier曲线和表面,以及Hermite样条,由于求值器只是提供了对曲线或表面的底层描述。程序员一般使用更高层次的接口,GLU提供了NURBS接口,该接口封装了大量代码,最终渲染大部分是由求值器完成的。但也提供了额外的功能原创 2016-10-12 10:46:18 · 3848 阅读 · 0 评论 -
使用基本Bezier求值器绘制曲线和曲面
OGL求值器OGL只能绘制基本的顶点图元,但是要绘制曲线或曲面就需要使用求值器,使得存储更少的信息渲染时候求值得到需要的效果。OGL求值器基本是指Bezier求值器,可以对顶点,法线,颜色和纹理坐标分别进行求值。Bezier曲线曲面求值器可以对简单的曲线曲面进行绘制,因为Bezier缺点是增加控制点时,曲线和曲面变得不可控难以得到平滑效果,这个时候需要采用B Spline(均匀B样条或非均匀B原创 2016-10-10 10:17:43 · 3192 阅读 · 0 评论 -
gluPerspective右手坐标系中透视投影剖析-线性中都要除以-z 和 zn、zf是距离
1.结果是没有除以w之前的值yScale = cot(fovY/2), fovY越小,yScale缩放比例差距越大, 一般fovY取90度,fovY/2为45度, 视图坐标系到透视4D空间中yScale = 1。2.w/h比例越大说明xScale缩放比例越小,yScale由fovY指定,而且要正好反比例:w/h = yScale/xScale 。xScale = yScale / aspect,原创 2016-05-27 11:27:45 · 1412 阅读 · 0 评论 -
物惯(子到父节点)变换顺序原因和不同坐标系下的变换顺序详解
在基于同一个参考坐标系中(也就是子节点到父节点坐标系中的变换),对于一个基本变换,D3D中要先缩放->旋转->平移。OGL中要先平移->旋转->缩放,其中的原因解释?OGL中是左乘矩阵,因此子节点变换到父节点是先平移后旋转缩放,才是正确的变换顺序。关于先平移后旋转不是OGL中解释的每次是基于当前嵌套坐标系变换,而是因为变换的矩阵乘法顺序和乘法规则规定的。D3D中先旋转后平移才能原创 2016-05-28 11:20:52 · 3361 阅读 · 1 评论 -
OGL绘制像素数据之位图字体
位图是对于一个像素位置用一个位表示,有用1表示,没有用0表示,有用当前颜色渲染,没有用底色渲染。像素是对一个像素位置用一个整型表示(8,16,32位都有),一个整型可以代表颜色索引,也可以代表一个颜色包含RGBA像素数据。字体除了直接用纹理库表示,常用为位图库表示,ascii/unicode只是编码代号,当真正绘制时候是将代号和显示列表标示符一一对应(显示列表和字体库对应)映射的思想产生需原创 2016-08-15 08:32:42 · 833 阅读 · 0 评论 -
OGL位图像素数据绘制流程-OGL重心
图像每个元素不是用0,1的位表示,而是用一个整型包含了RGBA通道的图像。.jpg,.png,.tga, .bmp都是经过图像格式包装的图像。图像可以来自颜色缓存区(后台缓存区,前台缓存区),也可以来自深度缓存区和模板缓存区。图像中的int可以记录颜色,也可以记录其它数据,例如法向量,高度图,法线贴图就是这样的图像。图像在GPU端有个纹理内存,存储CPU解包传输过来,经过纹理映射或可以原创 2016-08-17 10:17:50 · 1910 阅读 · 0 评论 -
OGL纹理之多维纹理/纹理数组/压缩纹理图像/drawcall优化
一维纹理有时候用一维纹理就够了,例如带纹理的镶条。一维纹理就是高度为1的二维纹理图像,并且它的顶部和底部没有边框,左右可以有。所有二维纹理和子纹理所定义的函数都存在二维版本。如果有图像处理子集卷积操作,那么也会受影响,其它像素操作也会对纹理产生影响。1.定义一维纹理函数:glTexImage1D (GLenum target, GLint level, GLint internalfo原创 2016-08-26 09:55:00 · 1483 阅读 · 0 评论 -
OGL纹理颜色组合函数glTexEnvf
OGL纹理函数就是对纹理颜色,多边形片段本身的颜色(指定的,或是来自光照得到的多边形顶点颜色),环境颜色 等颜色进行组合的函数。在OGL 2.0以后基本用Fragment Shader可编程来实现颜色的组合。但是了解传统的固定管线的纹理颜色组合函数对于正确的编写Fragment Shader是很有好处的。glTexEnvf函数可以通过glTexEnvf函数来指定纹理函数。函数原型:原创 2016-08-30 10:53:54 · 5624 阅读 · 0 评论 -
详解OpenGL的坐标系、投影和几何变换-矩阵压栈思想/矩阵列式存储
详解OpenGL的坐标系、投影和几何变换OPengl的渲染流程是先全部设置好数据和状态,GL_MODELVIEW是将当前要变换的空间向量和模型视图矩阵当前最顶矩阵(会乘以摄像机变换乘投影矩阵的矩阵得最终变换矩阵)关联存储好包括状态设置,提交渲染时候glflush才会提交渲染数据和命令。glPushMatrix()和glPopMatrix()的配对使用目的是方便得到需要变换的最顶矩阵,同时消转载 2016-05-06 10:58:53 · 2462 阅读 · 0 评论 -
Normal Transformation(法线变换)
转载自:http://blog.csdn.net/bugrunner/article/details/7285356法向量只有方向没有大小,平移变换不会改变法向量,旋转变换M^-1^T逆的转置还是本身,均匀缩放变换也不会改变法向量,所以一般游戏中应用的变换可以直接作用于法向量变换,如果存在不均等的缩放变换,那么对法向量进行MV变换会得到不正确的结果,这个时候就要对法向量进行M^-1^T逆变换,转载 2017-02-09 11:09:21 · 3853 阅读 · 1 评论 -
unity3d渲染路径整理
方向光源是最不消耗GPU资源的。点光源的阴影较消耗GPU资源。聚光灯是较消耗GPU资源的。Area light区域光源无法用于实时光照,只适用于光照贴图烘培。Cookie如果是平行光或聚光灯 那么可以是2D的纹理遮罩贴图,如果是点光源那么cookie要是cubemap texture立方体纹理。unity3d渲染路径:只有平行光在forward渲染模式下支持阴影,其它光源类型在pl原创 2017-09-18 13:14:50 · 1294 阅读 · 0 评论 -
关键帧逐帧蒙皮动画原理
一、关键帧动画怎么插件的,还有GPU蒙皮关键帧动画也称为属性插值动画,一般用于2d非图像质变的动画,主要是对图像的大小,旋转,移动进行插值的关键帧动画,只需要一幅图片就可以,插值方式有线性插值,样条插值。二、逐帧动画是每个帧都有图片,用一个图片序列,按照时间间隔来播放动画,用动画设计软件进行动画设计时候使用关键帧动画设计,但是输出为逐帧动画,2d动画很多采用这个模式。三原创 2017-08-09 23:27:36 · 1956 阅读 · 1 评论 -
向前光照和延后光照渲染器问题和原理
首先光照分为实时光照和烘焙光照,这里讨论的是对动态物体采用的实时光照。1.为何提前光照计算在多光源下需要多个drawcall?因为光照计算主要涉及点光源,聚光灯,平行光,环境光;主要的光照计算是漫反色光照模型:Cd = max( dot(l,n), 0) * Sdiff + Mdiff.镜面反色模型:blinn:Cs = pow( max( dot( normalize( l+v原创 2017-05-19 13:17:45 · 3079 阅读 · 0 评论 -
OGLES Shader间数据传递修饰符
顶点着色器的输出和片段着色器的输入保存在插值器中,对每个顶点用向量数组的方式存储。(OGL会对Uniform变量和插值器进行打包,打包后会更好的利用内存,所以对于uniform数量和顶点输入,输出,片段输入输出的数量在打包后不超过限制即可正常运行)。(1) 着色器输入输出和变量类型限定符in(默认类型),out,inout, const, invariant。GLSL 1.4版本中原创 2017-03-13 09:21:10 · 1004 阅读 · 0 评论 -
纹理矩阵堆栈/深度纹理和阴影的绘制
纹理矩阵堆栈纹理矩阵堆栈和模型视图矩阵堆栈,投影矩阵堆栈一样是普通的矩阵堆栈,只不过作用于纹理坐标。默认情况下纹理矩阵是单位矩阵,因此显式指定或自动生成的纹理坐标并不会发生变化。但是启用纹理矩阵后,这些纹理坐标就会进行纹理矩阵变换,实现纹理沿着表面滑动,绕表面旋转,收缩放大镜像等效果或者这些表现的组合效果。纹理矩阵启用为:glMatrixMode(GL_TEXTURE);// OG原创 2016-09-07 10:51:54 · 2242 阅读 · 0 评论 -
OGLES顶点着色器
顶点着色器在模型变换到裁剪空间阶段,主要进行几何变换和光照的计算,逐顶点颜色,法线和纹理坐标计算。顶点着色器的输入包括1)属性2)统一变量和统一变量缓冲区3)采样器4)着色器程序顶点着色器内建变量1)内建特殊变量gl_VertexIDgl_Positiongl_InstanceIDgl_PointSizegl_FrontFacing是否是正面2)原创 2017-03-13 10:50:59 · 764 阅读 · 0 评论 -
OGLES图元和绘制函数详细总结
图元的类型点,直线,三角形。绘图模式//点精灵,顶点着色器输出gl_PointSize指定半径,片段着色器中用gl_PointCoord来指定坐标,坐标是左上为原点和OGL屏幕坐标系(左下为原点)相反所以用gl_PointCoord指定纹理时候要小心看是否要转换,uv坐标都是基于屏幕坐标系的,但是一般顶点信息处理会根据选择DX还是OGL处理好顶点uv传入都是正确的。#define GL原创 2017-03-12 17:11:23 · 2863 阅读 · 0 评论 -
屏幕空间变换在透视除法裁剪的DNS空间后进行和glViewport
总结出两点:1.屏幕坐标变换数据来源是在透视投影后,硬件进行透视除法裁剪后的DNS设备坐标系中的数据。2.透视投影是将视图(摄像机)坐标系,转换到4D空间中(2D正交投影不用考虑透视除法), 并且注意zn,zf正负值,aspect是用倒数参数xScale缩放的,aspect越小xScale越大,放到屏幕中也越大。屏幕转换那一步会将DNS坐标中的值等比的缩放充满整个屏幕。屏幕左边逆向转换到世界左原创 2016-05-26 11:23:58 · 1853 阅读 · 0 评论 -
GLSL语法知识汇总
一、基础类型和限定符1.GLSL基础变量类型:(1)Float;// IEEE浮点值(2)int ;(3)uint;(4)bool;(5)sampler; 采样器,作为访问纹理图像的不透明句柄。OGL实现可能并不严格地实现这些类型,例如整数也可以存储在浮点寄存器中,最大整数也不一定是2^15。2.变量的作用域变量可以在使用时候声明,类似C++,不像C(c原创 2017-02-04 22:09:57 · 14857 阅读 · 0 评论 -
图形学数学变换的领悟-持续更新
一、基本概念和前提基本矩阵含义,四元数含义,欧拉角。理解矩阵的基向量特点分解组合作用;四元数有一般的信息在变换乘法中;欧拉角存在万向锁。不同坐标系下乘法顺序,矩阵逆,旋转绕向,正面定义不同。变换坐标系区别(左手坐标系,右手坐标系是不同的,3ds max坐标系),矩阵行列式的区别,乘法顺序的区别,正反面的区别,一定要清楚变换前提条件,否则很容易导致难以觉察的计算错误。原创 2016-07-01 10:42:37 · 1087 阅读 · 0 评论 -
OGLES 程序和着色器间的数据传递
一、通过顶点属性下标传递的顶点和索引数据1.Shader端设置:(1) 着色器输入输出等限定符in(默认类型),out,inout, const, invariant。GLSL 1.4版本中attribute和varying字段都删除了,都统一使用in out或inout关键字。顶点着色器的输入数据有:位置,颜色,法向量,纹理坐标,雾坐标,实例id等,例如:gl_Verte原创 2017-03-08 12:02:03 · 1544 阅读 · 0 评论 -
GLSL执行逻辑和基础框架
Shader执行逻辑Shader的执行是和app的drawcall相关的,一次draw call会进行一次顶点处理和片段处理,这个时候就会用一段Shader程序来代替,但是Shader程序是基于并行的顶点或像素上的,所以每个Shader程序执行的时候,都是并行处理的。并且着色器输入数据,也会为了一个完整顶点的处理或者完整像素的处理,会从非连续的显卡内存区域获得它需要的数据:glEnable原创 2016-11-15 10:37:13 · 1014 阅读 · 0 评论 -
GLSL基础概念和用法
图形图像顶点和片段像素的渲染,只能用固定管线或可编程着色器任何一种进行处理。一、顶点着色器顶点着色器,根据应用程序的设计,只是选择处理:1.视觉空间变换(模型,法线,纹理).2.主颜色和辅助颜色的计算生成(光照在摄像机坐标系中进行实时光照计算).3.纹理坐标计算。4.雾坐标设置和处理。5.点大小。新的顶点着色器或者支持更多的处理。并不是顶点管线的所有操作都可原创 2016-11-15 09:47:20 · 14321 阅读 · 0 评论 -
OpenglES 3.0基础知识
一、Opengles特性1.对Opengl的简化,比如OGL指定网格数据,可以用立即模式,可以显示列表,和顶点数组;但是Opengl es上只能用顶点数组方式传递几何数据。2.对Opengl兼容,尽量定义为一个精简的opengl子集,也能够在Opengl中运行。3.为了降低耗电和提高shader性能,引入了类型精度限定符。4.确保实现图像质量的最小功能集,符合openglel图像质原创 2017-03-04 18:14:20 · 9868 阅读 · 0 评论 -
OGL实例和窗口系统关系和freeglut
需要windows上编译用CMake freegult即可。// 绘制的东西都在全局坐标的原点,世界坐标的原点,也就是世界坐标原点是转换到屏幕中心的 glutSolidCube(1.0); //使用上面的头文件是不行的,需要GLUT的窗口框架,win7 64只能用GL/glut.h#include #include //设置背景颜色和坐标系统原创 2016-05-13 10:10:54 · 1498 阅读 · 0 评论 -
FBO和FBOA离线缓存对象方便高效实现累积缓存功能
FBO是一种索引机制。FBO本身并没有任何图像存储区,只有多个关联点。FBO重要应用操作纹理图像(texture images)和渲染缓存图像(renderbuffer images)。FBOA是FBO attach(附加对象),是纹理图像或渲染缓冲对象,是真正读取或写入FBO的数据的地方。FB是窗口系统默认帧缓冲区域,FBO绑定切换到0可以对当前渲染输出的窗口系统缓冲操作。FBOA的渲染缓冲原创 2016-09-14 10:58:35 · 1617 阅读 · 0 评论 -
FrameBuffer帧缓冲区及其操作,测试,颜色混合抖动掩码逻辑写入
混合是源和目标像素进行的,抖动是在混合后进行的,上面的操作数据都还是放置在临时缓存区中,写入掩码和逻辑操作后才是最终的将结果像素和目标像素进行逻辑写入默认是GL_COPY。深度缓存和模板缓存的写入也受到掩码和操作函数控制,stencil测试公式是:stencil ref &mask op stencil value &mask,sicssor测试更快;alpha测试,深度测试,默认都是禁用的,启用原创 2016-09-13 10:03:43 · 4892 阅读 · 0 评论 -
OGL纹理之纹理替换glTexSubImage2D/glCopyTexSubImage2D/纹理矩形
glTexSubImage2D函数提供修改图像函数,因为修改一个纹理比重新创建一个纹理开销小得多,对于一些视频捕捉程序可以先将视频图像存储在更大的初始图像中(该图像大小要求是2的次方,OGL 2.0后没有这个限制),创建一个渲染用的纹理,然后反复调用glTexSubImage2D(修改的图像区域不用是2的次方)函数从图像视频图像区域读取数据到渲染纹理图像中。渲染用的纹理图像只需要创建一次即可。原创 2016-08-25 09:50:14 · 17817 阅读 · 3 评论 -
OGL多重纹理映射
片段着色时候当前片段上的颜色,都要和当前的纹理进行操作得到当前片段颜色,逐级递增得到最终纹理颜色,默认启用第一层的纹理颜色。现在讨论传统的多重纹理映射,Fragment Shader中多重纹理也是类似的概念只是放到Shader中操作。1.建立多重纹理每一级的纹理都有自己的纹理状态,纹理图像,过滤参数,纹理环境应用,纹理坐标自动生成,顶点数组指定,纹理片段组合方式。多级纹理中指定操作其中原创 2016-09-04 10:58:27 · 1043 阅读 · 0 评论 -
多个glBindBuffer和glDrawXXX 需要glBindVertexArray VAO指定
一个VAO有多个VBO,它们之间也是通过上下文,只有唯一的激活VAO,在VAO后创建的VBO都属于该VAO。关联VBO数据用取得当前激活的缓存区对象偏移来指定。VAO是一个对象,其中包含一个或者更多的Vertex Buffer Objects。而VBO是Graphics Card中的一个内存缓冲区,用来保存顶点信息,颜色信息,法线信息,纹理坐标信息和索引信息等等。VAO在Gra原创 2016-05-20 11:40:49 · 8240 阅读 · 0 评论