由于本人比较懒,基本上混迹于问答板块与朋友们交流U3D开发很少发主题帖,由于最近对shader开发非常感兴趣所以在这里准备写一些自己学习shader的一些经验与心得,然后与朋友们分享一些写shader的乐趣。(本主题非教学贴,仅限于交流,欢迎指出错误之处) 一:工欲善其事必先利其器 首先推荐两本学习shader非常有必要而且很不错的书。 学习shader你首先应该必备一些写shader的语法 支持GPU的编程的语法有三种 微软提供的HLSL,OpenGL提供的GLSL,还有NVIDIA提供的Cg 在这里推荐使用Cgunity3d入门因为Cg编写的Shader同时兼容Direct3D和OpenGL。 那么要怎么学好Cg语言呢? 那么《 Cg教程---可编程实时图形权威指南》一定可以满足你的需求 这是一本英译书,所以建议有点英语基础的小伙伴去购买英译版的然后自己理解,学习然后再推荐一本在国内本就不多的shader 教程中比较不错的书《unity 3D ShaderLab开发实战详解》 二:Shader原理及基础 书本介绍完了那么首先来了解下shader的工作原理吧 从字面意思来说shader翻译过来就是着器,所以可以理解为给我们想要看见的东西画上颜,学习计算机的朋友都知道计算机的GPU就是为此服务的,而我们写shader的目的也就是告 文章来自【狗刨学习网】 诉GPU我们画在屏幕什么位置,什么颜,什么形态等等。 他们的工作流程是: 1.坐标系变换,(物体空间坐标->世界坐标->摄像机坐标->裁剪空间坐标) 2.流水线图形,(着顶点->图元装配->光栅化->插值,贴图,着) 3.unity3d渲染流程(固定关系和可编程管线的渲染) 4.光栅操作(像素所有权测试->裁剪测试->alpha测试->模板测试->深度测试->混合->抖动显示->逻辑操作) 这些之中 与我们shader编程密切相关的就是第三点 固定渲染管线 这是标准的几何&光照(Transforming&Lighting)管线,功能是固定的,它控制着世界、视、投影变换及固定光照控制和纹理混合。T&L管线可以被渲染状态控制,矩阵,光照和采制参数。功能比较有限。基本所有的显卡都能正常运行。 可编程渲染管线 对渲染管线中的顶点运算和像素运算分别进行编程处理,而无须象固定渲染管线那样套用一些固定函数,取代设置参数来控制管线。 在unity3d引擎中运用了自定义的ShaderLab来组织Shader的内容并对不同平台进行区别编译。 在Unity3d中Shader又可分出三种形态 1.(Fixedfunction Shader) 属于固定渲染管线 Shader, 基本用于高级Shader在老显卡无法显示的Fallback。使用的是ShaderLab语言,语法与微软的FX files 或者NVIDIA的 CgFX类似。 2.(Vertex and Fragment Shader) 最强大的Shader类型,属于可编程渲染管线. 使用的是CG/HLSL语法。 3.(Surface Shader) 被誉为ShaderLab的骄傲 Unity3d推崇的Shader类型,使用Unity预制的光照模型来进行光照运算。使用的也是CG/HLSL语法。 三种Shader共同点: (1)都必须从唯一一个根Shader开始 (2)Properties参数部分,作用及语法完全相同 (3)具体功能都在SubShader里(Subshader: 子Shader,Shader会自上而下运行第一个硬件能支持的Subshader,主要作用是对不用硬件的支持。) (4)都可以打标签,例如Tags {"RenderType" = "Opaque" } LOD 200 以及LightingOn等 (5)都可以Fallback (6)都可以处理基本的功能,例如光照漫反射(Diffuse)以及镜面反射(Specular)。但是Vertex and Fragment和Surface都能实现Fixed function实现不了的高级功能,例如基于uv计算的效果等等。 三种Shader不同点: (1)Fixed function shader以及Vertex and Fragment Shader在Subshader下面还有pass{},但是Surface Shader,由于已经将具体内容打包在光照模型了,不能加pass{},加了会报错。 (2)Fixed function shader每句代码之后没有分号';' 但是V&F shader以及Surface shader每句代码之后都必须加分号';' (3)核心结构不同 |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论