![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Computer Graphics 计算机图形学
靖心
降低成功的时间复杂度,提高生活的空间复杂度
专注,努力不会白费的!
展开
-
OpenGL基础 - 统一变量Uniform
简单理解就是一个GLSL shader中的全局常量,可以随意在任意shader(vertex shader, geometry shader, or fragment shader)访问,不同的shader中uniform是一起链接的,初始化之后,不能修改其值,否则会引起编译错误。1 定义以及使用Uniform变量的方法:1) 使用location的方法定位赋值:vertex shad...原创 2018-07-18 21:52:33 · 3169 阅读 · 0 评论 -
Computer Graphics Thinking - 视野矩阵 view matrix
3D世界中,在计算各个物体位置的时候是以世界坐标为主的,但是最终却是所有3D模型都需要转换到视野空间中的(view space),这样才能在屏幕中显示出来。我们可以想象3D空间中有很多模型(人物,汽车,枪等),同时也一直都存在一个摄像头,而我们就是通过这个摄像头去看我们创造的3D世界的。原创 2014-03-06 07:38:43 · 2248 阅读 · 0 评论 -
图形学思考 - 关于物体位置变换 Translation
物体位置变换是图形学的基础但是其实对于初学者来说其实不是那么容易理解透切的知识。不信?仔细想想这个问题:计算机到底是如何把一个物体从空间的一个位置移动到另外一个位置的呢?我这里要解说前面那个问题。比如下面的图:火箭是如何从坐下的位置移动到右上的位置的呢?因为如上面的translation 公式好像是移动一个点的位置的,但是这个火箭明显由无数个点组成啊?难倒是火箭的所有点都乘以Translation矩阵?那么计算一个小小的物体的位移岂不是要消耗大量的计算时间?其实差不多可以这么理解,不过不完原创 2014-03-03 08:18:23 · 2299 阅读 · 0 评论 -
图形学思考 - 高亮反射光 Specular Light
高亮反射光 Specular Light就是平时我们看到的一个光滑球面会发射的耀眼光。那么为什么很多球面会有这种效果呢?这个是不是球面的特性,还是某些表面的特性, 如镜面?从图形学的角度解答:不是球面的特性,也不是镜面的特性。为什么呢?原创 2014-03-11 07:34:08 · 2681 阅读 · 0 评论 -
图形学思考 - 聊聊透视图投射矩阵perspective projective matrix
什么是透视图投射矩阵perspective projective matrix?空间物体的坐标乘以投射矩阵,那么就可以把空间的物体投射到屏幕上。大体是这样的矩阵:这里探讨一个问题:为什么乘以这个矩阵就可以把空间物体投射到屏幕上了呢?看看下面的图:其中的Projection Window就是我们的屏幕位置。我们需要把所有两条斜边和Near Plane 和Far P原创 2014-03-05 07:36:36 · 5134 阅读 · 0 评论 -
图形学思考 - FPS更新率的比喻
帧率为60FPS的意思就是每秒更新60帧,一帧就是指GPU画一个画面的图案。可以这么比喻吧:GPU相当于一个超级画家, CPU相当于这个超级画家的超级助手,画家每秒画了60幅画,还有时间展示出来给我们看,看完了还把看过的画擦掉,因为画家只有两幅画布(当然到了D3d11可以是3幅画布),展示给我们看一幅画同时擦掉另一幅画,然后画上新的图案,然后再展示给我们看,然后再擦去另一幅画,如此循环。超级助手负责告诉画家,观众在那里,应该把画放在什么地方,应该画多大的尺寸等等。好忙的画家啊。画家有多少时间做这样的原创 2014-03-03 08:14:58 · 1864 阅读 · 3 评论 -
图形学思考 - 空间坐标转换的理解思考过程
图形学中最常进行的一个计算就是:模型空间modle space 和世界空间world space之间的转换。应用场景如:在模型空间中绘制这个模型是最方便的,绘制之后就需要把这个模型放在一个场景中,这个场景的所有物体都不必然是以世界空间进行计算的。如下图:到底如何理解这两者之间的转换过程呢?理解思考过程应该如下:1 关键就是先假设modle space和w原创 2014-03-04 07:44:34 · 1981 阅读 · 0 评论 -
C++实现一个Vector3空间向量类
Vector2,3,4类在DirectX中都有现成的可以调用,不过要实现其中的功能其实也不难,也都是一些简单的数学知识罢了。本文用C++实现一个简单的Vector3类的功能,暂时有的功能是:1 + - * /算术运算2 向量的数量积,又叫:点乘3 向量的向量积,又叫:叉乘4 向量单位化(normalization) //Vecotr3.h#pragma oncee原创 2013-11-23 15:05:57 · 8957 阅读 · 3 评论 -
DPI and Device-Independent Pixels
DPI and Device-Independent PixelsDots per inch (DPI) Device-independent pixel (DIPs).DPI:Points(点):一种尺寸的单位长度就是一个点。一般来说一点是1/72英寸:1 pt = 1/72 inch这个尺寸是可以改变的。在计算机屏幕显示的时候,由于像素不是固定的翻译 2013-12-22 08:22:24 · 2378 阅读 · 0 评论 -
图形学思考 - 旋转物体的问题
要彻底理解好如何旋转一个物体原来也不是很容易的事情这里有一个比较难理解的问题:为什么有些书本上说:利用transformation操作,重复绘制同一个物体(比如要画很多球),比直接在不同位置直接画球要节省很多计算时间了。其中的本质原理是什么呢?一个简单场景的选择有三个选择的方法:1 旋转世界坐标2 旋转物体在世界坐标中的位置3 旋转镜头位置原创 2014-03-07 08:25:47 · 2934 阅读 · 0 评论 -
图形学思考 - 漫射光 diffuse light
我们玩游戏的时候见到各种炫目的效果基本上都离不开光照渲染的功劳。顺便说下,目前我见过最好的光影效果的游戏大概应该是细胞分裂-复仇,那种真实感,质感真是让人震惊。光照模型主要由三种:1 Diffuse Light 漫射光2 Ambient Light 环境光3 Specular Light 高亮光这里主要说说漫射光实际看看周围的桌面,墙面,太阳照射到上面的时候,我们就能看原创 2014-03-10 08:42:09 · 2448 阅读 · 0 评论 -
几何着色器 Opengl Geometry Shaders 笔记
Geometry Shaders (简称:GS)笔记这个应该翻译为几何着色器吧,这个Shader可以做很多特效,这里先记录,并记熟一些要点,然后在用来做一些特效。这个属于Opengl - 主要是shaders,的学习性笔记了,记录的比较随意,并非tutorial式的东西。1. A geometry shader has access to all of the vertices原创 2017-12-11 19:33:03 · 977 阅读 · 0 评论 -
OpenGL 实现Interpolation插值算法
这是一个静态插值算法的效果,图形学中插值算法应用十分广,如动画,photoshop, autocAD等软件画曲线,还有shader中的渐变上色也是一个硬件支持的插值算法。Interpolation是很低层的算法,在图形学中可以说无处不在。本程序通过设置两个vector,然后就可以在这两个vector之间插入点,得到不同的效果如两个vector不同长度可以得到:如果长原创 2014-05-30 18:25:22 · 3501 阅读 · 2 评论 -
OpenGL 5: Shader画心形
初始化Open Program的四个函数:GLuint shaderProgram = glCreateProgram();glLinkProgram(shaderProgram);glValidateProgram(shaderProgram);glUseProgram(shaderProgram);这样创建并使用了一个Open GL Program ,这里是用来装 GL sha原创 2014-05-28 15:25:15 · 3711 阅读 · 0 评论 -
OpenGL二 - 画一个五角星 pentagram
使用数学计算出10个五角星的坐标,然后画出图形。效果如下:一直想使用Polygen画是实心的,但是Polygen对于凹的地方支持不好,会出问题,所以就使用直线画了。数学计算可以参考一个百度提问:http://zhidao.baidu.com/link?url=tDFNJu1UzgMaxkDvKWTVadaSwmkEpn1tLL6M-5e85M_ZcE6UHhmm7W6N原创 2014-05-23 21:16:23 · 3746 阅读 · 0 评论 -
OpenGL 4 : 一个美丽的心 For you, My Love
画一个心形有很多公式可以使用,下面这个公式我认为最完美了:float x = R * 16 * pow(sin(theta), 3);float y = R * (13 * cos(theta) - 5*cos(2*theta) - 2*cos(3*theta) - cos(4*theta));画出来的心形最漂亮,最原始的笛卡尔的心形是个肥心,没这个好看,呵呵。效果如下:原创 2014-05-25 12:41:33 · 1736 阅读 · 0 评论 -
OpenGL 3:画圆
这次使用OpenGL画圆,并且中间画一个实心的五角星。1. 画实心五角:因为之前使用Polygen画会出现问题,也许是各个GPU硬件也会不一样的,所以使用Polygen画实心五角星并不可靠;所以这里直接使用三角形画出五角星,不需要Polygen。2 画圆因为GLEW里面没有现成的圆形,所以只能使用人工定顶点,然后画圆的方法;其中的数学原理可以参考这里:http://slab原创 2014-05-24 21:29:28 · 5002 阅读 · 1 评论 -
3D Transformation 3D物体位移函数
如何操作物体在3D空间中的位置呢,方法有很多。这里总结一下最流行的矩阵操作。1. 放大缩小一个物体,我们可以填写一个放大缩小矩阵,如下代码:void InitScaleTransform(Matrix4f& m) const{ m.m[0][0] = m_scale.x; m.m[0][1] = 0.0f ; m.m[0][2] = 0.0f ; m.m[0]原创 2014-06-05 21:12:59 · 1518 阅读 · 0 评论 -
图形API的两种模式
图形API可以分为retained-mode APIs(保存模式API)和immediate-mode APIs(中间模式API). Direct2D是immediate-mode API,而Windows Presentation Foundation(WPF)是retained-mode API.Retained-mode API:用户程序使用图元(基本几何图形)构造一个场景,如某形状,直线等。。图形库保存一个场景模型在内存中。要画一帧图形,图形库把场景转换成为一系列的画图命令,在帧与帧之间,图形卡翻译 2013-12-18 07:59:00 · 3245 阅读 · 1 评论 -
3D游戏技术 - 大型3D地图优化渲染技术
技术简介:如果需要渲染一个大型3D地图,由于数据量,需要渲染的东西非常多,所以尤其一些慢一点的机器就会变得非常卡。如下面这些会造成帧率(FPS)下降的图:这样的图:还有这样的魔兽世界的图:到底暴雪是如何让这些场景流畅地渲染的呢?那就必须想办法提高渲染速度,也就是帧率(FPS)要提高,才能使得游戏流畅。会用到的相关技术会有:1 地图分块剔除2 kd树3 BSP树4 LOD技术等等,最后把场景优化到极致,才能创造出伟大的游戏。每一种技术都需要挺长篇幅介绍的,本文就分原创 2013-11-30 08:22:53 · 17603 阅读 · 26 评论 -
3D模型动画技术 - 皮肤变形计算(skinned meshes)
骨骼 skeleton就是表示其物体支架的向量。它提供了网格(meshes)分级,方便驱动一个角色的动画系统。骨骼的表面由皮肤包围,就成为一个立体模型了。这些皮肤是由向量和几何图形组成的。各个骨骼相互影响,以此达到模拟真实动作的效果,如人手运动。与前面一般动画不同的是 root坐标不一定是世界坐标,比如是人的躯干坐标。顶点混合( Vertex Blending)关节处的皮肤在实际世界中是会邹起来的,如下图:要模拟这个效果就需要用到vertex blending这个技术了。关节处的verte原创 2013-11-01 20:10:50 · 2895 阅读 · 0 评论 -
游戏碰撞检测 AABB包围体 sphere 圆形包围体计算
包围体Bounding Volumes有时候我们想要计算一个mesh模型的Bounding Volume。一般使用圆形和AABB。如下图,左边AABB,右边圆形: 圆形是由它的圆心和半径确定其位置,AABB是有其最小和最大顶点确定位置。 使用包围体的原因是可以只测试一个图形就确定这个包围体里面的所有meshes的碰撞状态。如果希望更加准确的碰撞,那么就可以测试到包围体重合原创 2013-10-28 09:17:07 · 3315 阅读 · 0 评论 -
DirectX 操作.X格式文件总结
Loading an .X File导入.X格式的文件这个是微软格式的模型文件。存储各种任务,树木,花草等模型信息的文件,可以导入并显示与程序屏幕中,导入函数:HRESULT D3DXLoadMeshFromX( LPCSTR pFilename, DWORD Options, LPDIRECT3DDEVICE9 pDevice, LPD原创 2013-10-27 22:24:21 · 4547 阅读 · 0 评论 -
平面阴影技术 DirectX例子 图形学2
平面阴影虽然不能满足所有的阴影要求,但是如果是相对简单的场景的话,用平面阴影也是个不错的选择,它的优点是速度快,并不需占用多少运算时间。步骤如下:1. 定位需要渲染阴影的物体,和阴影所在平面2. 计算出平面上阴影的物体定点,定义一定透明度,如50%透明度3. 渲染一、首先解决问题是如何计算方法就是利用向量代数和空间解析几何的知识,知道了光照的方向向量,物体定点,和平面位置,原创 2013-10-20 21:12:48 · 2393 阅读 · 0 评论 -
Stenciling技术实现镜子效果 图形学1
本人花时间整理的渲染镜子的技术,有需要的朋友可以参照一下。出处。http://blog.csdn.net/kenden23简介:模板缓冲(The stencil buffer)(或者翻译为蒙蔽层缓冲吧)属于是一个后台缓冲,不过它跟back buffer不一样,它主要用来完成一些特效。比如:镜子效果,阴影效果等。它的缓冲大小是和一般的后台缓冲(back buffer)和深度缓冲(de原创 2013-10-19 14:53:44 · 2671 阅读 · 0 评论 -
DirectX中如何分屏显示
有人认为这个很难做,其实在DirectX中是很方便做到的,就是利用视图转换技术(Viewport Transform)视图其实就可以想象成一个镜头口,对着什么地方,就能显示什么地方的东西。而3D图形里面可以说是后台缓冲(back buffer)的所见的内容。一般游戏都是把视图窗口布满整个back buffer的,但是我们可以把back buffer分隔开,以前的三国无双是可以分上下屏,让两个玩原创 2013-10-25 18:30:19 · 2816 阅读 · 0 评论 -
图形学 Direct3D的3D模型处理2 - 邻接三角形的信息及优化
邻接三角形信息对于某些的模型操作mesh operations),例如优化,需要知道三角形的邻接信息。Mesh的adjacency array存储着这样的信息。ajacency array是一个DWORD数组。每个元素存储一个索引,表示一个mesh中的三角形。例如下标为i的就表示第i个三角形,可以通过计算得到三角形顶点索引信息:A = i · 3B = i · 3 + 1C =原创 2013-10-26 18:53:53 · 2126 阅读 · 0 评论 -
图形学 Direct3D中手动创建3D模型
手动写一个模型是非常麻烦的,这就是为什么需要美工来做3D模型,美工利用各种可视化的软件如:3DSmax, maya, Blender等等,那样方便做出各种3d模型。如果手工设置,直接编程出来的话,工作量会相当大,甚至不一定能做出我们想要的模型,但是理论上这是可能的,所以我们看看如何做。属性表当模型的mesh被优化,那么它会如下排序:属性表就是一个D3DXATTRIBUTERANGE原创 2013-10-26 19:55:58 · 2009 阅读 · 0 评论 -
DirectX的Vertex Buffer顶点缓冲的理解和应用 Shader必知必会
故名思义Vertex Buffer就是存放顶点的缓冲。相当于一个内存区,指明了这些几何图形的顶点的位置。一般简单的几何图形,如正方形,手动地可以定义这些顶点,定义好顶点之后,就需要如下这样来设置好,才能开始画图,而这正是DirectX里面最难理解的问题之一,和OpenGL也一样,同样需要这样设置的,OpenGL SuperBibl 第五版中居然把这个问题放到了差不多最后一个章节去介绍,可想而知原创 2013-10-26 07:50:39 · 3933 阅读 · 0 评论 -
Shader Effects 一些着色器的额外功能
Shader渐渐成为主流了,然而大多数公司我估计还是在使用普通的固定管道的功能吧,本文就总结一些用Shader能做,而用固定渲染管道不能做的功能,让大家看看shader的魅力。1. 丢弃像素这个是固定渲染管道所没有的功能,当然非要用固定渲染管道做差不多同样的效果是差不多可以的,就直接吧alpha值设计为0.但是之所以我说差不多,是因为用shader做的这个功能更加强大,shader是可以直原创 2013-10-22 13:40:28 · 1426 阅读 · 0 评论 -
Alpha Test 透明通道测试技术做篱笆效果图
Alpha test是可以通过测试然后丢弃不需要渲染的像素的。顾名思义就是根据他的alpha值与某特定值比较。这个技术做腐蚀效果,某些电影特技如:可以让一个人慢慢各个部位褪色,最后消失……等,而且不需要消耗什么计算时间。计算公式:IF as (Openration function) ref == true THENaccept pixel ELSE reject pixel原创 2013-10-22 19:44:50 · 2699 阅读 · 0 评论 -
AABB类实现
简介:AABB是最常用的碰撞检测使用的包围盒。听起来好像很神秘的,其实就是一个简单的数据结构。原理可以一句话概括:因为可以说所有的2d和3d物体都是由点组成的,所以只要找出这些物体的最大值点和最小值点,那么就可以使用这两个点表示该物体的AABB包围盒了。检测碰撞的时候我们只需要检测这些物体的AABB(即他们的最大值点和最小值点)是否相交,就可以判断是否碰撞了。缺点:不准确,因为AABB不能很准确地包围一个物体,所以难免会在不相交的时候误判为相交,如下图:原创 2013-12-09 07:47:17 · 2682 阅读 · 1 评论 -
关键帧和动画
关键帧和动画Keyframes and Animation关键帧就是预先记录各个级别的动画数据。前面的机械手和太阳系系统都是在运行的时候计算出动画的。关键帧就是一个对于模型各级别在某个时刻的重要位置。比如关键转完处,动作变向处等。通过一定算法,计算机能自动计算出其关键帧之间的动作位置。这样我们就能产生平滑的动画了。如果做过flash和photoshop的朋友都知道这个概念。但是原创 2013-10-31 08:29:52 · 2038 阅读 · 0 评论 -
第一人称游戏技术 - 实现在高低不平的3D地形上行走效果
在高低不平的地图上行走比在平面上行走要困难很多,因为y轴的高度要随着地形不同而变化,要想让镜头固定在地面上某一高度,模拟人在上面走的感觉就牵涉到很多技术.下面看看效果图如何:下面看看其中的关键技术是什么。1 取得高度图的高度要定义一个可以行走在高低不平的地图上的Camera,首先需要定义一个函数getHeight(x,z),取得地图的高度,一般定义为y坐标大小。设p = (px,py,pz)为当前Camera的位置。我们利用函数getHeight(x,z)计算py = getHeight原创 2013-11-28 07:50:19 · 7836 阅读 · 5 评论 -
C++求点和平面的关系
一个平面通常是由一个平面法线向量,如v1(1,2,3),和点到原点(0,0,0)到平面的距离确定的。当然数学中还有其他定义方法,但是DirectX和OpenGL都是使用这种定义方法的。这样定义的平面叫一般平面,其实是由点法式平面变形来的。点我们可以使用Vector3类来确定,这个类既可以确定点,也可以确定向量。下面定义一个平面:CreatePlane函数是用三个点确定一个平面,并计算成一般平面,存储好。 classfyPoint这个函数就是用来计算点和平面的关系的。实现代码:原创 2013-11-24 08:56:58 · 4249 阅读 · 0 评论 -
打造3D游戏中第一人称视觉效果 - 带可测试源代码下载
首先解决的一个问题:什么是镜头?我们可以想象拍戏那种镜头,对着什么东西,就能拍出什么东西,然后我们就可以在电视屏幕或者电影屏幕上看到这些东西。3D世界里面也是这样定义一个镜头,在这个镜头范围之内的东西就可以显示在电脑屏幕中。如下图在一个方各地上行走: 下面是把镜头抽象起来:拍戏的时候,这个镜头是个实体,那么在我们的3D世界里面我们也是这样把镜头当做一个实体,在代码中体原创 2013-11-02 15:07:02 · 5883 阅读 · 0 评论 -
DirectX如何构建一个太阳系
基本上都是之前学过的知识,要运用好!总结运用的知识有:1 物体移位选择(transformation)2 树形数据结构管理整个场景的信息3 根据时间控制恒星旋转效果图片如下:首先设置太阳系各恒星的数据结构 枚举太阳,恒星和月亮三个对象类// We classify the objects in our scene as one of three types.enum SolarType原创 2013-10-30 07:57:00 · 3494 阅读 · 0 评论 -
Direct3D中模拟机械手动作
人的动作是如何实现的呢?这就要用到分级网格(mesh)的知识了。所谓分级也属于场景管理的基本知识,就是把不同模型分级管理,比如人的手臂是一级,作为父母级,然后前臂是下一级,手掌又是一级,这样分开,以达到模拟人手动作的效果。如下: 相当于一个机械手,以各个节点为分界,分级。跟一般的变形(transformation)差不多,只不过世界坐标作为root坐标,由r原创 2013-10-29 19:18:06 · 2601 阅读 · 0 评论 -
图形学 - 多层纹理技术的底层原理
多层纹理技术就是可以把多个纹理都贴在一个几何图形上,形成一个新的纹理。刚接触这个技术肯定不好懂,但是我们剖析其基本的底层原理就是:每一个纹理就是一张图片,每一张图片就相当于很多像素组合起来的文件,一般每个像素也是由32位组成的,所以把这些像素和不同像素的值“加”起来就可以形成新的像素了。如下图,是龙书书本上的图,但是读者不一定能看懂这个图的意思, 书本上的分析好像也不好懂,也许是偏于数学化原创 2013-10-23 14:35:11 · 1631 阅读 · 0 评论 -
图形学 Direct3D的3D模型处理1
下面大部分内容来自DirectX龙书,整理了一下,模型格式其实也是一些格式化的文档,保存了定点,单位向量,材质坐标等信息。这里主要讲怎么在DirectX里面怎么操作。Mesh由几何图形组成,一般是由三角形组成。Direct3D的.x的3d模型文件就是由三角形组成的。保存模型数据用ID3DXMesh,是有ID3DXBaseMesh集成而来的。ID3DXBaseMesh 接口包括了顶点缓冲(vertex buffer)存储Mesh的顶点,和索引缓冲(index buffer)用来定义顶点的渲染顺序,原创 2013-10-24 18:48:22 · 1928 阅读 · 0 评论