纳金网

标题: shader基础教程上-着色器:开始 (一) [打印本页]

作者: 会飞的鱼    时间: 2011-11-22 16:14
标题: shader基础教程上-着色器:开始 (一)






           此教程将指引你如何建立自己的Shaders,让你的游戏场景看起来更好。Unity配备了强大
           

           的阴影和材料的语言工具称为ShaderLab,以程式语言来看,它类似于CgFX和Direct3D的语法,
           

           它不只纪录基本的端点或者映像点(vertex/pixel)资讯,也描述了材质所必要的一切资讯。
           

           在unity材质检视器中可以看到Shaders的性质及多重shader(SubShaders)的描述,针对不同图
           

           形硬件,每个描述也都完整的说明了图形硬件的彩现状态,fixed function pipeline如何设定、
           

           vertex/ fragment programs如何作用。 Vertex and fragment程序可以使用高阶Cg程式语言或
           

           低阶shader组合。
           

           在这个教程中,我们将描述如何使用fixed function与programmable pipelines两种方式于
           

           ShaderLab中撰写shaders,我们假设读者拥有基本的OpenGL或Direct3D彩现概念,并对cg有
           

           fixed function与programmable pipelines的常识,HLSL或GLSL编程语言技术,一些Shader教
           

           程与参考文件可于NVIDIA以及AMD的开发站上取得。
           

           建立一个新的shader有两种方法,可以由菜单Assets->Create->Shader新增,或复制一个既有
           

           的shader再进行编辑,新的shader可以透过双击来启动编辑画面(UniSciTE)
           

           下面开始介绍一个基础的shader范例:
           

           Shader "Tutorial/Basic" {
           

           Properties {
           




            _
           
           Color ("Main Color", Color) = (1,0.5,0.5,1)
           

           }
           

           SubShader {
           

           Pass {
           

           Material {
           

           Diffuse [
           
            _
           
           Color]
           

           }
           

           Lighting On
           

           }
           

           着色器:开始
           

           1
           

           }
           

           }
           

           Shader "Tutorial/Basic" {
           

           Properties {
           


            _
           
           Color ("Main Color", Color) = (1,0.5,0.5,1)
           

           }
           

           SubShader {
           

           Pass {
           

           Material {
           

           Diffuse [
           
            _
           
           Color]
           

           }
           

           Lighting On
           

           }
           

           }
           

           }
           

           这个shader范例只是众多shader中最基本的一个,它定义了一个颜色性质,名称为Main Color,
           

           并指定了玫瑰色的效果(red=100% green=50% blue=50% alpha=100%),在调用时会跳过
           

           Diffuse的材质设定(
           
            _
           
           Color)并开启顶点光源。
           

           要测试这个shader,你可以建立一个新的材质,并于Shader下拉菜单选择(Tutorial->Basic),
           

           再把这个新材质指定到物件上,拖拉材质检视器的颜色表并查看其变化。是时候研究更复杂的事情
           

           了!
           

           假如你开启一个既有的复合shader,刚开始看可能会觉得有点难,在开始以前,我们将详细说明
           

           unity内建的VertexLit shader。这个shader使用fixed function pipeline产生标准的per-vertex
           

           照明。
           

           Shader "VertexLit" {
           

           Properties {
           

           2
           


            _
           
           Color ("Main Color", Color) = (1,1,1,0.5)
           


            _
           
           SpecColor ("Spec Color", Color) = (1,1,1,1)
           


            _
           
           Emission ("Emmisive Color", Color) = (0,0,0,0)
           


            _
           
           Shininess ("Shininess", Range (0.01, 1)) = 0.7
           


            _
           
           MainTex ("Base (RGB)", 2D) = "white" { }
           

           }
           

           SubShader {
           

           Pass {
           

           Material {
           

           Diffuse [
           
            _
           
           Color]
           

           Ambient [
           
            _
           
           Color]
           

           Shininess [
           
            _
           
           Shininess]
           

           Specular [
           
            _
           
           SpecColor]
           

           Emission [
           
            _
           
           Emission]
           

           }
           

           Lighting On
           

           SeperateSpecular On
           

           SetTexture [
           
            _
           
           MainTex] {
           

           constantColor [
           
            _
           
           Color]
           

           Combine texture * primary DOUBLE, texture * constant
           

           }
           

           }
           

           }
           

           }
           

           Shader "VertexLit" {
           

           Properties {
           


            _
           
           Color ("Main Color", Color) = (1,1,1,0.5)
           


            _
           
           SpecColor ("Spec Color", Color) = (1,1,1,1)
           

           3
           


            _
           
           Emission ("Emmisive Color", Color) = (0,0,0,0)
           


            _
           
           Shininess ("Shininess", Range (0.01, 1)) = 0.7
           


            _
           
           MainTex ("Base (RGB)", 2D) = "white" { }
           

           }
           

           SubShader {
           

           Pass {
           

           Material {
           

           Diffuse [
           
            _
           
           Color]
           

           Ambient [
           
            _
           
           Color]
           

           Shininess [
           
            _
           
           Shininess]
           

           Specular [
           
            _
           
           SpecColor]
           

           Emission [
           
            _
           
           Emission]
           

           }
           

           Lighting On
           

           SeperateSpecular On
           

           SetTexture [
           
            _
           
           MainTex] {
           

           constantColor [
           
            _
           
           Color]
           

           Combine texture * primary DOUBLE, texture * constant
           

           }
           

           }
           

           }
           

           }
           

           所有的shaders都必须以Shader作为开始,接着是这个shader的名称(例如:VertexLit),这个名
           

           称将会显示于检视器(Inspector)。所有的语法都必须放在{ }之内。
           

           如果要把shaders放在unity的submenus下面,请使用斜线,例如:MyShaders/Test,你将会
           

           看到有个submenu名为MyShaders,下面有个shader名为Test,或是像这样MyShaders->Test
           

           在Properties block下面接着的是SubShader block,每个描述都在这个段落中
           

           4
           

           Properties
           

           properties位于shader block一开始的位置,你可以定义任何性质,这些性质将可在材质检视器中
           

           编辑,在VertexLit的个范例中,properties block看起来像这样:
         






           properties block内的语法都是单行的,每一个性质描述都由内名称开始(例如:Color,
           

           MainTex),在后方的括弧号中所显示的名字也会显示于inspector检视器上,在此之后,描述的是
           

           该性质的预设值:
         






           可用的性质类型请参考Properties Reference。预设值与性质有关,以color为例,预设值应该由
           

           四个值组成。
         

作者: 奇    时间: 2012-2-21 23:21
既来之,则看之!

作者: tc    时间: 2012-4-11 23:33
不错哦,谢谢楼主

作者: markq    时间: 2012-4-12 22:47
不错 非常经典 实用
作者: C.R.CAN    时间: 2012-5-4 23:26
好`我顶``顶顶

作者: 菜刀吻电线    时间: 2012-9-6 23:38
水……生命之源……灌……

作者: C.R.CAN    时间: 2013-1-30 23:32
很有心,部分已收录自用,谢谢

作者: 晃晃    时间: 2013-2-1 23:31
心中有爱,爱咋咋地

作者: 晃晃    时间: 2013-2-21 23:24
凡系斑竹滴话要听;凡系朋友滴帖要顶

作者: 奇    时间: 2013-3-21 23:30
顶!学习了!阅!

作者: nts    时间: 2013-10-18 18:51
学习了谢谢




欢迎光临 纳金网 (http://wwww.narkii.com/club/) Powered by Discuz! X2.5