计算机图形学

第1章 欢迎来到Shader的世界

南笙酒味 提交于 2019-12-02 05:55:28
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/e295166319/article/details/78594238 欢迎来到Shader 的世界!我们曾不断听到周围有人提出类似的问题:“ Shader 是什么” “我应该看哪些书才能学好Shader" "学习Unity Shader,我应该从哪里着手”。我们希望这本书可以告诉你这些问题的答案。如果本书是你学习Shader 的第一本书,我们希望这本书可以为你打开一扇新的大门,让你离制作心目中的优秀游戏的心愿更近一步:如果不是,我们同样希望这本书可以让你更深入地理解Shader 的方方面面,在学习Shader 的过程中更上一层楼。 1.1 程序员的三大浪漫 有人说,程序员的三大浪漫是编译原理、操作系统和图形学(是的,我己经听到很多人在反 驳这句话了,不要当真啦〉。不管你是否认同这句话,我们只是想借此说明图形学在程序员心目中 的地位。正在看此书的你,想必多多少少都对图形学或者渲染有一定兴趣,也许你想要通过此书 来学习如何实现游戏中的各种特效,也许你仅仅是好奇那些绚丽的画面是如何产生的。我们是程 序员中的“外貌协会”,期待着用代码编写出一个绚丽多姿的世界。这就是我们的浪漫。 我想,读者大概都经历过这样的场景

Unity粒子系统和其他

前提是你 提交于 2019-12-02 02:36:05
1、Shuriken粒子系统   在3D游戏里,大部分的游戏对象可以用meshes(网格模型)的形式来呈现。2D游戏通常用sprites(精灵)来显示。对于固定形状的游戏对象,网格模型和精灵的确是非常理想的视觉呈现方式。但在游戏里还需要其他的元素或对象,它们的自然形状并非固定不变,因而难以用网格模型或精灵实现。   例如风云雷电雨雾等,这类的对象通常要靠粒子系统特效完成。 (1)什么是粒子系统   粒子系统是指很小很简单的2D图像或者3D网格模型。在粒子系统中,通过各种设置让微小的粒子以某种特定的形态展示出来,就形成了粒子特效。   一般来说,每个粒子都有预定的生命周期。通常设置为数秒。在这段时间内,粒子会经历不同的变化。 (2)Shuriken粒子系统   2012年,Unity从3.5版本开始支持Shuriken粒子系统。在Unity里,粒子系统是以组件的形式实现的。   粒子系统虽然有很多属性,但大体上可以分为三类: 粒子系统的主模块、粒子系统的具体属性模块、以及默认的粒子纹理及Shader 。 2、Shader的使用 (1)什么是Shader   在计算机图形学中,Shader(着色器)是指专用于渲染着色的计算机程序,其作用是设置图像的光照、阴暗和色彩等。Shader通常以极高的灵活性在图形硬件上计算所渲染的效果。大多数的Shader在编码时是针对图形处理单元(GPU)的

第一章 计算机图形学基础

两盒软妹~` 提交于 2019-12-01 07:26:56
1.1 计算机图形学的研究内容 计算机图形学的主要研究内容就是研究 如何利用计算机表示、生成、处理和显示 的一门学科。 1.2 计算机图形学与图像处理 计算机图形是矢量型的,而计算机图像是点阵型的。 计算机图形系统是从数据到图形的处理过程;计算机图像处理是从图像到图像的处理过程。 计算机图形与计算机图像有一定的联系,经过处理可以相互转换。 1.3 计算机图形学的发展 1963年1月,MIT林肯实验室24岁的萨瑟兰完成了关于人机通信的图形系统的博士论文。萨瑟兰引入了分层存储符号的数据结构,开发了交互技术,可以用键盘和光笔实现定位、选项和绘图,还提出了至今仍在沿用的许多图形学的其他基本思想和技术。萨瑟兰的博士论文被认为既是计算机图形学的奠基,也是现代计算机辅助设计之肇始。 20世纪70年代,由于光栅显示器的诞生,光栅图形学算法迅速发展起来;基本图形操作和相应的算法纷纷出现,图形学进入了第一个兴盛时期。70年代,很多国家应用计算机图形学,开发CAD图形系统,并应用于设计、过程控制和管理、教育等方面。 80年代中期以来,大规模集成电路使计算机硬件性能提高,图形学得到飞速的发展。1980年,第一次给出了光线跟踪算法。真实感图形的算法逐渐成熟。 80一90年代,图形学更加广泛地应用于动画、科学计算可视化、CAD/CAM、虚拟现实等领域。这向计算机图形学提出了更高、更新的要求——真实性和实时性。

【Canvas学习笔记】基础篇(二)

岁酱吖の 提交于 2019-12-01 07:25:52
一、贝塞尔曲线 1.1 什么贝塞尔曲线   贝塞尔曲线(Bézier curve),是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋我们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的。   贝塞尔曲线是计算机图形学中相当重要的参数曲线,它通过一个方程来描述一条曲线,根据方程的最高阶数,又可以分为线性贝塞尔曲线、二次贝塞尔曲线三次贝塞尔曲线和更高阶的贝塞尔曲线。 1)二次贝塞尔曲线   二次贝塞尔曲线由三个点 P0 、 P1 、 P2 来确定,这些点也被称为控制点,如下图:   对于二次贝塞尔曲线的绘制我们可以这样理解: 首先在线段 P0P1 和 P1P2 上分别选取一个点 Q0 、 Q1 ,使得 P0Q0 / P0P1 = P1Q1 / P1P2 = t , t 的取值范围在[0,1]; 连接 Q0 、 Q1 ,在线段 Q0Q1 上选取一个点 B ,使得 Q0B / Q0Q1 = P0Q0 / P0P1 = P1Q1 / P1P2 = t ,此时B就是曲线上的一点; 将t的值从0过渡到1,不断重复上面的步骤,计算出所有的点 B ,连接所有符合条件的点 B ,就可以得到一条二次贝塞尔曲线。 2)三次贝塞尔曲线   三次贝塞尔曲线由四个点 P0 、 P1 、 P2 、 P3 来确定

OpenGL中一种高效的线段反走样技术

↘锁芯ラ 提交于 2019-11-30 11:21:39
令人讨厌的“走样” 我在日常工作中通过传统的OpenGL绘制函数绘制线段时,发现绘制出的线段边缘充满了“锯齿”,而这种“锯齿”在线段运动和旋转时往往会更加明 显(图 1)。这种我们不希望看到的“锯齿”被成为“走样”,而消除这种“锯齿”的过程就是我们所说的“反走样”。虽然OpenGL提供了诸如设置 GL_LINE_SMOOTH 属性、多重采样等线段反走样的方法,但效果和质量受到很多方面的限制,而且不同的硬件厂商使用不同的反走样算法,所以使得反走样的结果在不同的GPU上有 着不同的效果。因此我们需要一种更为高效和通用的线段反走样技术。 图1 采用传统OpenGL绘制方法绘制的线段 为什么会“走样”? 在介绍如何对线段反走样之前,我们必须了解为什么我们绘制的线段会产生“走样”。 我们都知道,在数学的定义中一条线段是由两个端点确定的,而线段是没有宽度和面积的。但在计算机图形领域中,为了让人的肉眼能够看到,必须给线段 一定的宽 度,所以我们的线段通常是由两个端点和一个宽度参数确定的,而我们计算机中图形的宽度通常都是以像素为单位的,因此我们的线段宽度有可能是1像素也有可能 是n像素。 如果需要在白色的背景下绘制一条宽度为1像素的黑色线段,从信号处理的观点上来看,我们可以把这条线段看做一个值为1的信号,而线段外部的区域信 号值为0,如果不加任何处理,线段的边界就是这样一个不连续的阶梯函数(图2)

深入浅出计算机组成原理:GPU(下)-为什么深度学习需要使用GPU?(第31讲)

柔情痞子 提交于 2019-11-28 17:47:39
一、引子 上一讲,我带你一起看了三维图形在计算机里的渲染过程。这个渲染过程,分成了顶点处理、图元处理、栅格化、片段处理,以及最后的像素操作。这一连串的过程, 也被称之为图形流水线或者渲染管线。 因为要实时计算渲染的像素特别地多,图形加速卡登上了历史的舞台。通过3dFx的Voodoo或者NVidia的TNT这样的图形加速卡, CPU就不需要再去处理一个个像素点的图元处理、栅格化和片段处理这些操作。而3D游戏也是从这个时代发展起来的。 你可以看这张图,这是“古墓丽影”游戏的多边形建模的变化。这个变化,则是从1996年到2016年,这20年来显卡的进步带来的。 二、Shader的诞生和可编程图形处理器 1、无论你的显卡有多快,如果CPU不行,3D画面一样还是不行 不知道你有没有发现,在Voodoo和TNT显卡的渲染管线里面,没有“顶点处理“这个步骤。在当时,把多边形的顶点进行线性变化,转化到我们的屏幕的坐标系的工作还是由CPU完成的。 所以,CPU的性能越好,能够支持的多边形也就越多,对应的多边形建模的效果自然也就越像真人。而3D游戏的多边形性能也受限 于我们CPU的性能。无论你的显卡有多快,如果CPU不行,3D画面一样还是不行。 2、1999年NVidia推出的GeForce 256显卡 所以,1999年NVidia推出的GeForce 256显卡,就把顶点处理的计算能力

计算机图形学押题(更新中...)

左心房为你撑大大i 提交于 2019-11-28 05:10:39
已经形成了某多面体的顶点表 边表和面表,怎样写程序检查三张表中的整体一致性 平面上有多个红点和多个蓝点,问是否存在一条直线,能够让所有红点在一侧,蓝点在另一侧.请设计一个算法判断. 设空间有两条线段AB和CD,其端点坐标分别为 , 和 , ,怎样判断它们是否相交?若相交,求出交点坐标。 写一个算法,能迅速地判断一条直线与一个凸多边形是否相交,若相交求出交点。 *解答:* 设直线由两点 和 确定,凸多边形由顶点序列 、 ··· (共n个顶点)确定。 算法的基本思想是:取多边形一条边,判断该边的两个端点是否在直线的同侧,如果在同侧,则该边与直线无交点;如果两个端点在直线的异侧,则线段与直线有交点,计算交点。依次检查多边形的所有边即可求出多边形与直线的所有交点,因为是凸多边形,所以交点最多有两个,算法可以在求出两个交点后就停止。判断点在直线的那一侧可使用第四节第二部分中介绍的方法,计算交点采用第一节中介绍的线段求交点中使用的方法。 算法具体过程如下: (1) 首先计算A=y2-y1;B=x1-x2;C=x2y1-x1y2; (2) 取多边形的P0点为P1,计算d1=A P1.x+B p1.y+C (3) for (i=1; i<=n; i++) { 1) 取多边形的下标为i%n的点为P2(这样可以在i=n时取P0点); 2) 计算d2=A p2.x+B p2.y+C 3) if (d1=

探究光线追踪技术及UE4的实现

爷,独闯天下 提交于 2019-11-27 13:46:26
目录 一、光线追踪概述 1.1 光线追踪是什么 1.2 光线追踪的特点 1.3 光线追踪的历史 1.4 光线追踪的应用 二、光线追踪的原理 2.1 光线追踪的物理原理 2.2 光线追踪算法 2.3 RTX和DXR 2.3.1 RTX(NV) 2.3.2 DXR(Microsoft) 三、UE4的光线追踪 3.1 UE4光线追踪的开启 3.2 UE4光线追踪的特性 3.2.1 光线追踪的阴影 3.2.2 光线追踪的反射 3.2.3 光线追踪的透明 3.2.4 光线追踪的环境光遮蔽 3.2.5 光线追踪的全局光照 3.2.6 光线追踪的其它特性 3.3 UE4光线追踪的调试 3.4 UE4光线追踪的不足 四、UE的底层实现 五、总结 特别说明 参考文献 一、光线追踪概述 1.1 光线追踪是什么 与传统的扫描线或光栅化渲染方式不同, 光线追踪(Ray tracing) 是三维计算机图形学中的特殊渲染算法,跟踪从摄像机发出的光线而不是光源发出的光线,通过这样一项技术生成编排好的场景的数学模型显现出来。 利用光线追踪技术渲染出的照片级画面。 与传统方法的扫描线技术相比,这种方法有更好的光学效果,例如对于反射与折射有更准确的模拟效果,并且效率非常高,所以当追求高质量的效果时经常使用这种方法。 在物理学中,光线追迹可以用来计算光束在介质中传播的情况。在介质中传播时,光束可能会被介质吸收

OpenGL光照1:颜色和基础光照

这一生的挚爱 提交于 2019-11-27 10:57:19
本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 前言 我们简要提到过该如何在OpenGL中使用颜色(Color),但是我们至今所接触到的都是很浅层的知识,现在我们要更深入地讨论什么是颜色,并且还会为学习光照(Lighting)创建一个场景 颜色 首先你要知道我们一直在使用有限的数值来模拟真实世界中无限的颜色,所以并不是所有现实世界中的颜色都可以用数值来表示的,然而我们仍能通过数值来表现出非常多的颜色,甚至你可能都不会注意到与现实的颜色有任何的差异 颜色可以数字化的由红色(Red)、绿色(Green)和蓝色(Blue)三个分量组成,它们通常被缩写为RGB,仅仅用这三个值就可以组合出任意一种颜色 例如,要获取一个 橙色(Coral) 色的话,我们可以定义这样的一个颜色向量: glm::vec3 coral(1.0f, 0.5f, 0.31f); 我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色,而是它所反射的(Reflected)颜色,换句话说,那些不能被物体所吸收(Absorb)的颜色(被拒绝的颜色)就是我们能够感知到的物体的颜色 太阳光能被看见的白光其实是由许多不同的颜色组合而成的,看下图

7、事例七 : OpenGL变换总结

不想你离开。 提交于 2019-11-27 10:06:50
OpenGL变换包括计算机图形学中最基本的三维变换,即几何变换、投影变换、裁剪变换、视口变换, 以及针对OpenGL的特殊变换概念理解和用法,如相机模拟、矩阵堆栈等,这些基础是开始真正走进三维 世界无法绕过的基础. 实际上,从三维空间到二维平面,就如同用相机拍照一样,通常都要经历以下几个步骤 (括号内表示的是相应的图形学概念): 第一步,将相机置于三角架上,让它对准三维景物(视点变换,Viewing Transformation)。 第二步,将三维物体放在适当的位置(模型变换(几何变换),Modeling Transformation)。 第三步,选择相机镜头并调焦,使三维物体投影在二维胶片上(投影变换,Projection Transformation)。 第四步,决定二维像片的大小(视口变换,Viewport Transformation)。 这样,一个三维空间里的物体就可以用相应的二维平面物体表示了,也就能在二维的电脑屏幕上正确显示了。 三维图形世界中的还有几个特殊坐标系的概念。 1)、显示三维图形的这个坐标系称为世界坐标系。 2)、要在图形显示器上显示,这就要在图形显示器屏幕上定义一个二维直角坐标系,这个坐标系称为屏幕坐标系。 这个坐标系坐标轴的方向通常取成平行于屏幕的边缘,坐标原点取在左上角,长度单位常取成一个象素的长度,大小可以是整型数。 3)