如何进一步学习 shader (CG) 的知识?

shader 学习 相关的例子
shader 学习 相关的例子
原文地址:。没有实用价值,但这应该是最简单的shader,可以帮助理解shader的基本工作原理。源代码下载。
原文地址:。简单的游戏漫反射够用了,开始涉及基本数学原理了。源代码下载。
原文地址:。可以模拟光滑、有光泽或磨光的表面。源代码下载。
觉得原文的教程有点跳跃,所以在教程3和4之间整理了一下使用纹理的基本方法。源代码下载。
解释了逐顶点和逐像素光照的区别,其他源代码好像都是使用逐像素光照模型。源代码下载。
这个例子比较简单。源代码下载。
原文地址:。使用法线映射可以让少量多边形构成的模型看起来具有丰富的细节,而视觉效果大量多边形构成的几乎一样,现今很多游戏都使用了法线映射,不过我总觉得这个示例有错误。源代码下载。
原文地址:。建议你可以试着用键盘控制物体沿xyz方向的变形。源代码下载。
原文地址:。在前几个教程的基础上实现了天空球和水面。源代码下载。
原文地址:。这是一项将3D物体转为类似2D手绘的卡通风格的技术。源代码下载。
原文地址:。通过光泽贴图可以控制模型不同部位的镜面反射强度。源代码下载。
这个例子来自于,原文地址:。使用了四种技术:颜色贴图,就是教程2的漫反射;发光贴图是新的,用一张额外的贴图控制漫反射强度,这个例子中表现出地球上的大城市的灯光效果;凹凸贴图,就是教程4的法线贴图,严格地说法线贴图只是凹凸贴图的一种,凹凸贴图还包含视差映射(Parallax Mapping)等;反射贴图就是教程8的光泽贴,通过一张额外的纹理控制模型不同部位的镜面反射强度,这个例子中让地球上的海面反射强度比陆地大。源代码下载。
原文地址:。《Professional XNA Game Programming: For Xbox 360 and Windows》一书中用了一章的篇幅介绍了PostScreen Shader,有些地方把PostScreen翻译成离屏或后屏,我就保留英文了。这个shader的基本思路就是先将场景绘制到一张纹理中(这叫做Render To RenderTarget,渲染到渲染目标),想了解工作原理,请见,然后对这个纹理施加各种滤镜效果,熟悉Photoshop的人对滤镜肯定不陌生,原理不难,唯一的限制就是用什么算法和你的想象力了,《Professional XNA Game Programming》一书的后三个游戏都使用了PostScreen Shader让画面更漂亮。源代码下载。
原文地址:。非常简单的一个算法,实现了反相的效果。这让我想起了《生化危机3》中当“追击者”出现时伴随着一声心脏跳动的声音,画面暂停并反相,表现出吃了一惊的效果。源代码下载。
原文地址:。使用两种不同的算法实现了图片灰度。源代码下载。
原文地址:。通过随机函数实现噪点效果。源代码下载。
原文地址:。通过一张Alpha贴图控制模型的透明程度。源代码下载。
原文地址:。此教程涉及了Framebuffer,BackBuffer,ZBuffer,DepthBuffer,StencilBuffer,我总结了一下,放在本文的最后部分。源代码下载。
原文地址:。这个教程有点难,我认为讲得也不够清晰,下次我会整理一个简单的反射、折射、动态反射例子的,还有源代码中可以使用X360手柄控制一些变量,我自己添加了键盘控制,用上下左右控制世界矩阵,用ADWS控制Du变量和C变量。源代码下载。
原文地址:。只需使用HLSL的内置refract函数计算折射向量。源代码下载。
原文地址:。主要思路是将两个场景绘制到两个渲染目标中,并使用HLSL的内置lerp函数对两者进行插值。源代码下载。
原文地址:。在前一个教程基础上还使用了另一个HLSL内置函数smoothstep。源代码下载。
感谢网友roujiao将这个HLSL教程编译成了电子书,下载。截止到日,教程已经更新到第24篇,而且作者也修复了教程4法线映射中的错误,有时间我会把它补齐的。
至此shader的基本实现方法已经告一段落了,想进一步学习,强烈推荐Nvidia网站,把上的shader都弄懂了,你就是高手了。
<img title="shader&学习&相关的例子" style="BORDER-LEFT-WIDTH: 0 LIST-STYLE-TYPE: HEIGHT: 147 BORDER-RIGHT-WIDTH: 0 BORDER-BOTTOM-WIDTH: 0 PADDING-BOTTOM: 0 PADDING-TOP: 0 PADDING-LEFT: 0 MARGIN: 0 PADDING-RIGHT: 0 BORDER-TOP-WIDTH: 0 WIDTH: 120px" alt="ShaderX" src="/DownloadImg/1/.png">
ShaderX:Direct3D ShaderX Vertex and PixelShader Tips and Tricks
学习Shader编程的经典图书系列,2002年出版,不过好像太老了,里面的代码都是用汇编实现的。,英文版,pdf格式,10.5MB。
<img title="shader&学习&相关的例子" style="BORDER-LEFT-WIDTH: 0 LIST-STYLE-TYPE: HEIGHT: 179 BORDER-RIGHT-WIDTH: 0 BORDER-BOTTOM-WIDTH: 0 PADDING-BOTTOM: 0 PADDING-TOP: 0 PADDING-LEFT: 0 MARGIN: 0 PADDING-RIGHT: 0 BORDER-TOP-WIDTH: 0 WIDTH: 120px" alt="ShaderX2Toturial" src="/DownloadImg/1/.png">
ShaderX2:Introductions&Tutorials with DirectX9
学习Shader编程的经典图书系列,2004年出版。(英文版,pdf格式,6.8MB),(38MB)。主要内容有:
DirectX HLSL语言介绍
vs_3_0和ps_3_0 Shader Models介绍
使用Direct3D9的高级光照和着色
不同的雾化效果
Stencil ShadowVolumes理论
使用RenderMonkey开发Shader
创建对Shader友好的模型技巧
<img title="shader&学习&相关的例子" style="BORDER-LEFT-WIDTH: 0 LIST-STYLE-TYPE: HEIGHT: 179 BORDER-RIGHT-WIDTH: 0 BORDER-BOTTOM-WIDTH: 0 PADDING-BOTTOM: 0 PADDING-TOP: 0 PADDING-LEFT: 0 MARGIN: 0 PADDING-RIGHT: 0 BORDER-TOP-WIDTH: 0 WIDTH: 120px" alt="ShaderX2Tips" src="/DownloadImg/1/.png">
ShaderX2:Shader Programming Tips&Tricks with DirectX9
学习Shader编程的经典图书系列,2004年出版。(英文版,pdf格式,15.3MB),(187MB)。主要内容有:
第一部分—几何体创建技巧Geometry Manipulation Tricks
第二部分—渲染技术Rendering Techniques
第三部分—Software Shaders和ShaderProgramming技巧
第四部分—图像处理Image Space
第五部分—阴影Shadows
第六部分—3D引擎和工具设计3D Engineand Tools Design
<img title="shader&学习&相关的例子" style="BORDER-LEFT-WIDTH: 0 LIST-STYLE-TYPE: BORDER-RIGHT-WIDTH: 0 BORDER-BOTTOM-WIDTH: 0 PADDING-BOTTOM: 0 PADDING-TOP: 0 PADDING-LEFT: 0 MARGIN: 0 PADDING-RIGHT: 0 BORDER-TOP-WIDTH: 0px" alt="ShaderX3" src="/DownloadImg/1/.jpg">
ShaderX3: Advanced Rendering with DirectX and OpenGL
学习Shader编程的经典图书系列,2004年出版。(英文版,pdf格式,30.6MB)。
ShaderX系列目前已出到ShaderX8,名称已变为GPU Pro,上述电子书和源码的来源地址为
<img title="shader&学习&相关的例子" style="BORDER-LEFT-WIDTH: 0 LIST-STYLE-TYPE: BORDER-RIGHT-WIDTH: 0 BORDER-BOTTOM-WIDTH: 0 PADDING-BOTTOM: 0 PADDING-TOP: 0 PADDING-LEFT: 0 MARGIN: 0 PADDING-RIGHT: 0 BORDER-TOP-WIDTH: 0px" alt="GpuGem2" src="/DownloadImg/1/.jpg">
GPU Gems 2: Programming Techniques for High-Performance Graphics and General-Purpose Computation
学习Shader编程的经典图书系列,2005年出版。(英文版,chm格式,14.4MB)。
<img title="shader&学习&相关的例子" style="BORDER-LEFT-WIDTH: 0 LIST-STYLE-TYPE: BORDER-RIGHT-WIDTH: 0 BORDER-BOTTOM-WIDTH: 0 PADDING-BOTTOM: 0 PADDING-TOP: 0 PADDING-LEFT: 0 MARGIN: 0 PADDING-RIGHT: 0 BORDER-TOP-WIDTH: 0px" alt="GpuGem3" src="/DownloadImg/1/.jpg">
GPU Gems 3
学习Shader编程的经典图书系列,2007年出版。(英文版,chm格式,26.2MB)。
GPU编程与CG语言
作者:半山工作室的康玉之,发表于2009年9月,(简体中文版,3MB)。应该去看看这篇文章的前言,真知灼见,现在中国搞基础研究的太少,比起外国,在图形学方面我们落后太多了。
发表评论:
TA的最新馆藏[转]&[转]&-860&次阅读
-763&次阅读
-857&次阅读
-885&次阅读
-827&次阅读
-1759&次阅读
-7574&次阅读
-1742&次阅读
-1919&次阅读
-2212&次阅读
扫描本网站二维码地址,把本网站链接分享给您的朋友!/学习方法及技巧
(1)由简入繁:自己写Shader,从最简单写起,简单的测试通过了,再一点点往里加。
(2)多调试:例如,有一个float变量x。假如x范围是[0,1],则在frag片段函数里输出 float4(x,0,0,1)的颜色,以红色的深浅来观察x的值;如果x范围是[0,1000],则可在frag片段函数里输出 float4(x/,1)的颜色。方法就这么简单,具体根据需要去调整。
(3)结合查看UnityCG.cginc等文件,以及unity的自带Shader,即Build-in Shader。
(4)看看书:建议看本教程的同时,多看看书。推荐英文的The CG Tutorial,也就是中文版的Cg教程_可编程实时图形权威指南
学习小技巧(1)查看UnityCG.cginc等文件使用Vertex and Fragment的CG时,会#include "UnityCG.cginc",用到里面的很多函数,如TRANSFORM_TEX,UNITY_TRANSFER_DEPTH等函数的定义。那么怎么查看这些定义呢?windows路径:Unity\Editor\Data\CGIncludesmac路径:右键点击unity图标-&show contents-&Data-&CGIncludes该文件夹下有Unity关于Shader的库,如UnityCG.cginc,UnityCG.glslinc,Lighting.cginc等。打开UnityCG.cginc(写字板MONODev等均可),后即可查看相关函数的定义。(2)电子书的学习技巧中文电子书,学起来快,好理解,但大多数是影印版。英文电子书,可以很好的用关键词搜索知识点。(3)使用#prama&only_renderers&d3d9 , 限定编译平台。(3)(4)配合使用效果更好(4)打开编译后的Shader,查看对应的汇编代码或者OpenGL ES代码。方法:左键单机shader文件,然后在Inspector面板里点击Open Compiled Shader.
Views(...) Comments()因为是做手游的shader,对效率和效果也都有比较高的要求,所以前一段时间一直在熟悉GPU的渲染流程以及基本的CG算法,现在已经可以熟练阅读复杂shader和shader的效果应用。前些天在看到一个大神写的shader中发现了可以直接用normalDir和ViewDir做为贴图的纹理坐标直接模拟了类似高光的效果,直接膜拜。现在感觉做shader很大一部分就像在做线性代数的数学题,所以也在补习线性代数的一些东西。特别想成为那种对于CG的各个函数信手拈来的使用,各个效果了然于胸的Shader高手,想请问各位大神哪些书里有我想要学习的知识?是要开始多看一些图形学算法么?求推荐。
《GPU编程与CG语言之阳春白雪下里巴人》这书的名字可真够长的,不过写的确实不错,可谓深入浅出。在书的结尾部分有基础材质算法,搞懂这些就算入门了。
1. 高層&br&&br&深入了解各種計算圖形學及數字圖像學的算法,要知道它們要解決什麼問題,現存有那些解決方案,每個方案的優缺點是甚麼。書籍太多,不在此列舉,可參考本人的豆列:&br&&ul&&li&計算機圖形: 入門/API類 &a href=&///?target=http%3A///link2/%3Furl%3Dhttp%253A%252F%%252Fdoulist%252FF& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&/doulist/1445744/&i class=&icon-external&&&/i&&/a&&br&&/li&&li&計算機圖形: 進階/專門 &a href=&///?target=http%3A///link2/%3Furl%3Dhttp%253A%252F%%252Fdoulist%252FF& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&/doulist/1445680/&i class=&icon-external&&&/i&&/a&&br&&/li&&li&計算機圖形: Gems類 &a href=&///?target=http%3A///link2/%3Furl%3Dhttp%253A%252F%%252Fdoulist%252FF& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&/doulist/1445745/&i class=&icon-external&&&/i&&/a&&br&&/li&&li&計算機圖形: 專欄結集 &a href=&///?target=http%3A///link2/%3Furl%3Dhttp%253A%252F%%252Fdoulist%252FF& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&/doulist/1445806/&i class=&icon-external&&&/i&&/a&&br&&/li&&li&計算機圖形: 動畫 &a href=&///?target=http%3A///link2/%3Furl%3Dhttp%253A%252F%%252Fdoulist%252FF& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&/doulist/1445716/&i class=&icon-external&&&/i&&/a&&br&&/li&&li&計算機圖形: 相關數學 &a href=&///?target=http%3A///link2/%3Furl%3Dhttp%253A%252F%%252Fdoulist%252FF& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&/doulist/1445735/&i class=&icon-external&&&/i&&/a&&br&&/li&&li&計算機圖形: 其他參考 &a href=&///?target=http%3A///link2/%3Furl%3Dhttp%253A%252F%%252Fdoulist%252FF& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&/doulist/1447740/&i class=&icon-external&&&/i&&/a&&br&&/li&&/ul&遊戲圖形程序員必讀的是《Real Time Rendering》(見進建/專門豆列),和shader有關的較前沿著作有《GPU Pro》叢書(見Gems類列)。&br&&br&計算機圖形學並不是追求物理上完全正確的解,而是觀眾/玩家看上去覺得好看。為了優化,有些問題可以通過近似化來減少運算,學習一些擬合函數(也需了解底層提供的現成函數),並作出嘗試。例如基於物理着色中的BRDF擬合[1]、SSS模擬[2]。&br&&br&有時候,可以分解一些複雜的函數,生成查找表(LUT)減少運算量,如下面[1]的示例:&br&&img src=&/32247cbadd61ae399fcbcabd_b.jpg& data-rawwidth=&668& data-rawheight=&307& class=&origin_image zh-lightbox-thumb& width=&668& data-original=&/32247cbadd61ae399fcbcabd_r.jpg&&&br&&br&2. 底層&br&&br&通常shader是圖形算法實現的一部分,程序員需要了解shader語言提供的指令,以及它們如何影射至更底層的匯編指令,有時候還要了解具體的GPU架構和特性。有些指令可能較少用,例如ddx/ddy這些,有時候能用於優化。可以參考shader語言手冊、各GPU廠商的官方文件,以及GDC的一些講座[3][4]。&br&&br&3. 數學&br&&br&如題主所言,數學佔了很大的部分,建議閱讀[5][6],之後可以找相關數學的豆列。&br&&br&參考&br&&br&[1] Brian Karis, &Real Shading in Unreal Engine 4&, &i&ACM SIGGRAPH 2013 Courses: &/i&Physically based shading in theory and practice, ACM, 2013. &a href=&///?target=http%3A///publications/s2013-shading-course/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/pub&/span&&span class=&invisible&&lications/s2013-shading-course/&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&[2] Colin Barré-Brisebois, Marc Bouchard, &Real-Time Approximation of Light Transport in Translucent Homogenous Media&, &i&Gpu Pro 2&/i&. Vol. 2. CRC Press, 2011. Slides: &a href=&///?target=http%3A////gdc-2011-approximating-translucency-for-a-fast-cheap-and-convincing-subsurface-scattering-look/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GDC 2011 – Approximating Translucency for a Fast, Cheap and Convincing Subsurface Scattering Look&i class=&icon-external&&&/i&&/a&&br&[3] Emil Persson, &Low-Level Thinking in High-Level Shading Languages&,
GDC 2013. Slides: &a href=&///?target=http%3A//www.humus.name/index.php%3Fpage%3DArticles%26ID%3D6& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Humus - Articles&i class=&icon-external&&&/i&&/a&&br&[4] Emil Persson, &Low-level Shader Optimization for Next-Gen and DX11&, GDC 2014. Slides: &a href=&///?target=http%3A//www.humus.name/index.php%3Fpage%3DArticles%26ID%3D9& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Humus - Articles&i class=&icon-external&&&/i&&/a&&br&[5] Lengyel, Eric. &i&Mathematics for 3D game programming and computer graphics&/i&. 3rd Edition, Cengage Learning, 2012.&br&[6] Schneider, Philip, and David H. Eberly. &i&Geometric tools for computer graphics&/i&. Morgan Kaufmann, 2002.
1. 高層深入了解各種計算圖形學及數字圖像學的算法,要知道它們要解決什麼問題,現存有那些解決方案,每個方案的優缺點是甚麼。書籍太多,不在此列舉,可參考本人的豆列:計算機圖形: 入門/API類 計算機圖形: 進階/…
按照楼主的说法,已经具有一些基础了,只是要更进一步而已。&br&据我了解来看,楼主可以做以下事情提升自己:&br&&br&&b&0. 图形学的物理原理。&/b&图形学的物理原理是一切效果的基石,不管你怎么去思考,&b&图形效果的物理背景总是优先考虑的。&/b&因为它们直观,而且被其他学科例如几何光学等充分检验过。例如光线在界面和介质中的传播是折射与反射的基础、例如散射是体积光和Godray(丁达尔效应)的基础。当你能将一种光学现象(例如镜面反射)与它的物理背景联系起来,你就理解了问题的一半。这一部分的参考资料可见:《PBRT》&br&&br&&b&1. 数学技巧。&/b&物理学会告诉你基本的方程,对你的方程进行数学分析,会让你把握一个数学物理模型的主要方面,简化问题的表达或者是让简单的模型进一步处理更加复杂的问题。&b&这些内容会分散在不同paper中&/b&,可能需要你有一定的阅读量。例如BRDF到BTF的简化、SSS材质的简化等。此处推荐《Real Time Rendering》&br&&br&2. &b&程序技巧。&/b&仅仅有数学你的模型可能还没有办法在有限时间内以足够好的效果呈现出来。这个时候需要一定的程序技巧进行偷工减料。例如查找表、Level Of Detail等。Paper,历年SIGGRAPH的Course,UE和CE的代码,都是程序技巧的源泉。这部分内容非常分散,很多都是见招拆招就事论事,必须要有大量的积累。另外这一部分还有很多Tricky,这也是为什么往往对着paper,但是总是做不出理想的效果的原因。这一部分几乎完全要靠个人感觉。除了多实验,多读别人的结果外,没有什么太好的办法。当然,GPU Gems和Shader X系列是挺不错的选择。&br&&br&&b&3. 技术美术经验。&/b&本质上讲,图形学是糊弄眼睛的技术。所以图形学中也会有一些完全不讲道理的技巧和方法。有时候一些看起来很炫、原理很复杂的东西,可能不讲道理会更方便。典型的例子包括镜头炫光、Skybox、抖动纹理坐标模拟bump/heat hazing。所以哪些选择在程序上实现,哪些由美术直接出一个唬弄人的效果,这个需要很充分的经验。这方面部分有专著或者成体系。大部分都可能是道听途说或者是灵机一动。这些内容,可能要比程序技巧更难找。&br&&br&&b&4. GPU编程经验。&/b&不管怎么折腾,最后总是要把一切都放到GPU上。Mobile GPU和桌面GPU相比,Vendor更多,设计更加复(华)杂(而)精(不)巧(实),所以到处都是G点(哦,不对,是瓶颈),戳起来很有讲究。比如某些卡上,内存访问是瓶颈,那有一些就要靠计算;在TBR上,就要尽量利用TBR的优势,把Viewport拆开绘制,等等。这些内容一般都见于硬件厂商的Slides中,历年的GDC Course都是比较理想的资料来源。
按照楼主的说法,已经具有一些基础了,只是要更进一步而已。据我了解来看,楼主可以做以下事情提升自己:0. 图形学的物理原理。图形学的物理原理是一切效果的基石,不管你怎么去思考,图形效果的物理背景总是优先考虑的。因为它们直观,而且被其他学科例如…
已有帐号?
无法登录?
社交帐号登录这篇文章是我在学习蛮牛的一套关于Shader教程()后的简单总结,个人感觉这套教程并不是以高级Shader编程为目的的,更像是授人以渔的宗旨。下面我会分为三个部分:Shader简述、图形学基础,Cg简介为大家介绍Shader的相关内容,也算是做一个总结。
一:Shader简述
&#160;&#160;&#160; a.先说一下GPU与CPU的区别,简单说:GPU主要负责跟显示相关的数据处理,而CPU主要负责操作系统和应用程序。为什么不把显示相关的数据直接交给CPU处理呢?下面附上解释:
&#160;&#160;&#160;&#160; b.Shader分类。Shader中文翻译为“着色器”,含义是:可编程图形管线。主要分为:Vertex Shader和fragment Shader,即定点Shader和片段Shader。上面有一个概念是“图形管线”,简单解释就是:计算机处理图形显示的处理流水线。
&#160;&#160;&#160;&#160;&#160; c.Shader 的主流编程语言。主流的Shader编程语言主要有HLSL、GLSL、CG。下面简单说一下区别:HLSL(High Level Shader Language)是微软基于DX的作品,只能运行在Windows平台上。GLSL(OpenGL Shading Language),OpenGL着色语言,是用来在中着色编程的语言(OpenGL是个定义了一个跨编程语言、跨平台的规格的专业的图形),是跨平台的着色器语言。到这里,我们已经可以发现有一个比较麻烦的问题出现了,就是我们底层图形驱动限制了上层的编程语言,一旦想要改动图形驱动库,那就不得不重写整个Shader Files,此时CG就应运而生了,CG在HLSL和GLSL上做了进一步封装,屏蔽了上层的着色器语言对底层图形库的依赖。
&#160;&#160;&#160;&#160;&#160; d.Unity Shader。ShaderLab其实是Unity对Shader语法结构的一种包装,其中支持三种Shader:surface Shader、Vertex and Fragment Shader 和 Fixed function shader 。Fixed function shader 是一种比较“保守”的Shader(兼容性最好),vertex and fragment Shader可以只用HLSL或GLSL或CG语言区编写,surface shader是对Vertex and fragment的一种语法包装,最终也会被翻译中Vertex and fragment Shader。(以上更具体信息的可以参考官方文档)
二:图形学基础
&#160;&#160;&#160;&#160; 个人感觉这一小节的内容对于未接触过图形学的人来说是挺有价值的,扫清了以前对于在Untiy中的坐标转换和渲染过程等的盲点。下面分两个小节去描述该部分的内容。
&#160;&#160;&#160; a.3D数学基础。其实3D数学无非就是矩阵的相关操作,对于学过线代的同学肯定都不是问题,这里我就简单介绍一下。
&#160;&#160;&#160; 1.坐标系与向量。3D分为左手和右手坐标系,可以参考(),示意图如下:
&#160;&#160;&#160; 2.向量相关的东西就不啰嗦了,比较重要的就是向量点乘和叉乘,这里附上参考文章()。
&#160;&#160;&#160; 3.矩阵相关。在3D数学中,矩阵往往代表着一种变换,这也是坐标系转换所依赖的数学原理。大家在Unity中肯定都听过“MVP矩阵”,MVP矩阵其实就是一种通过矩阵操作实现坐标系的转换一种方式。Unity中,有3中四种坐标系:模型坐标系、世界坐标系、摄像机坐标系、屏幕坐标系。这其实是3D图像显示的一个流程:从模型本身坐标利用_ObjectToWorld(即M矩阵)转换到世界坐标系,再利用_WorldToCamera(即V矩阵)从世界坐标系转换到摄像机坐标系,最后利用_Projection(P矩阵)实现从摄像机到屏幕坐标系的转换,并最终把3D图像显示在屏幕上,下面附上一篇百度文库的资料()。
矩阵几种重要的操作有:矩阵的行列式、矩阵的转置、矩阵四则运算、矩阵逆……这些知识这里就不啰嗦了,下面简单介绍一下几种常见矩阵变换。
绕坐标轴旋转矩阵:
缩放矩阵:
以上是几种比较常用的矩阵,更多的信息就得靠度娘和Google了。
&#160;&#160;&#160;&#160; b.下面介绍几个简单的图形学的应用:光照剔除,漫反射和高光的实现方式。
&#160;&#160;&#160;&#160; 1.光照剔除。到这里必须了解“法线的概念”(始终垂直于某平面的),我们的视角即从物体到摄像机的向量,如果法线N与视线E形成的角度小于90度,那么观察者应是大约是在正面,反之大于90度应在该面的反面,此时应是无法观察到物体的(法线的求得使用向量差乘,角度计算可以使用向量的点乘),这时候就需要将其剔除了,下面两幅图简单说明一下:
&#160;&#160;&#160;&#160; 2.漫反射(Diffuse 是投射在几盒体表面上的光向各个的现象),可以简单理解成光照对物体表面颜色的影响(在Unity中默认的Shader其实就是漫反射加环境光的综合作用)。那么该怎样计算光照对物体颜色的影响程度呢?此时还是需要用到法线,我们使用法线和光向量(必须先标准化)的点乘作为影响该区域颜色的因子,这样再乘以该光源的颜色信息就可以得到对应受光照影响后的颜色了,下面用简图说明一下:
&#160;&#160;&#160; 3.高光(Specular 光源照射到物体然后到人的眼睛里时,物体上最亮的那个点就是高光),从定义就可以得出高光其实和反射光与视角相互作用形成的,同样的我们在计算高光也是利用同样的原理:由入射光求反射光、再计算反射光和视向量的点乘得出影响因子,最后算出高光强度,简图说明一下:
以上是三种比较常见的光照相关的知识,更多资料只能依靠度娘了……
&#160;&#160;&#160;&#160; 三、最后一部分的内容就简单介绍一下Unity Shader 的语法基础和一个Demo,更具体的还是要参考Unity官方文档。
&#160;&#160;&#160;&#160; a.ShaderLab 语法基础。Unity 其实是支持上述三种Shader的,此处介绍的是Vertex and fragment Shader ,用的是CG语法。下面先贴一段Untiy 默认的
//Shader 文件在选择面板以树状结构组织的
Shader &Hidden/NewImageEffectShader&
//这个申明程序中所需要的变量信息
Properties
//_MainTex 变量名 ; “Texture” 在Inspector面板上显示的名称 ; 2D 指变量类型
// &white& 变量默认值
_MainTex (&Texture&, 2D) = &white& {}
// Shader 语法块,一个Shader程序至少有一个SubShader,系统在渲染时会依次调用,
// 直到找到匹配的SubShader,否则使用最后默认指定的Shader
// Cull Off:关闭阴影剔除 、
ZWrite : 要将像素的深度写入深度缓存中
// Test Always:将当前深度值写到颜色缓冲中
Cull Off ZWrite Off ZTest Always
//渲染通道,固定写法
//Shader 代码段开始
//指定顶点Shader入口
#pragma vertex vert
//指定片段程序入口
#pragma fragment frag
//引用Unity内置的一些定义
#include &UnityCG.cginc&
//自定义结构体
struct appdata
//float4 4维向量、POSITION 语义,相当于告诉渲染引擎,这个变量是代表什么含义
float4 vertex : POSITION;
//TEXCOORD0 纹理语义
float2 uv : TEXCOORD0;
struct v2f
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
//Vertex Shader 对应的入口
v2f vert (appdata v)
//appdata v 作为参数,渲染引擎会把对应语义的信息传递进来,此处会传递顶点的位置信息和纹理信息
//传递进来的顶点坐标是模型坐标系中的坐标值,需要经过矩阵转换车成屏幕坐标
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
//将计算后的结果输出给渲染引擎,底层会根据具体的语义去做对应的处理
//在Properties 中定义的变量需要在此申明一下才能在程序中使用
sampler2D _MainT
//fragment Shader 对应的入口
fixed4 frag (v2f i) : SV_Target
fixed4 col = tex2D(_MainTex, i.uv);
// just invert the colors
col = <span style="color: # -
//当上述的SubShader无法匹配硬件环境时,会调这个指定的默认Shader
Fallback &Mobile/VertexLit&
以上就是对Unity中的Vertex and fragment 中使用CG 语法的简单叙述,下面贴上一个Demo
二:Shader Demo,这里贴上一个简单的Demo,Demo的整个是一个Plane,没有使用任何的贴图,仅仅是使用Shader 改变其顶点和颜色信息实现的。下面是Demo的截图
下面贴上该Shader 的源码
Shader &Cus/Demo_3&
Properties
_MainTex (&Texture&, 2D) = &white& {}
// No culling or depth
Cull Off ZWrite Off ZTest Always
#pragma vertex vert
#pragma fragment frag
#include &UnityCG.cginc&
//自定义结构体,包含位置和颜色语义
struct v2f
float4 pos : POSITION;
float4 col : COLOR;
//Vertex shader入口,颜色信息也在此一并处理了
v2f vert (appdata_base v)
//计算旋转角度,利用_SinTime.w为旋转角度加上周期变换性质(_SinTime 是Unity提供的内置变量)
float angle = length(v.vertex)* _SinTime.w;
//绕Y轴旋转矩阵
float4x4 RM={
float4(cos(angle) , <span style="color: # , sin(angle) , <span style="color: #),
float4(<span style="color: # , <span style="color: # ,<span style="color: # , <span style="color: #),
float4(-<span style="color: # * sin(angle) , <span style="color: # , cos(angle),<span style="color: #),
float4(<span style="color: # , <span style="color: # ,<span style="color: # ,<span style="color: #)
//利用RM矩阵影响顶点位置信息
float4 pos = mul(RM , v.vertex);
//把顶点信息转换到世界坐标系中
o.pos = mul(UNITY_MATRIX_MVP, pos);
//由顶点到中心点的距离决定颜色信息
angle = abs(sin(length(v.vertex)));
o.col = float4(angle , <span style="color: # , <span style="color: # ,<span style="color: #);
//片段程序中直接返回顶点Shader中计算得到的颜色信息
float4 frag (v2f v) : color
ok,到这里这篇分享就结束了,下面附上一个用C#写的模拟3D图像渲染过程的Demo和上述Shader 的Demo(链接: 密码:1j1k)
阅读(...) 评论()}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信