Unity3D Shader官方教程翻译(二)

时间:2022-04-24 19:37:51

Unity3D Shader官方教程翻译(二)


1、Shader语法:属性

着色器可以由艺术家定义一个参数列表,这个参数值可以在Unity3D的材质检索器中查看。着色器中属性块定义了这些参数。

Properties { Property [Property ...] }

定义了1个属性块。


括号内的属性定义如下:

name ("display name", Range (min, max)) = number
定义了1个float属性,范围是在min到max之间的值,可以利用检索器中对应的滑块调节他们。


name ("display name", Color) = (number,number,number,number)
定义了一个颜色


name ("display name", 2D) = "name" { options }
定义了1个2D纹理


name ("display name", Rect) = "name" { options }
定义了1个矩形纹理属性


name ("display name", Cube) = "name" { options }
定义了1个cubemap纹理属性


name ("display name", Float) = number
定义了1个float


name ("display name", Vector) = (number,number,number,number)
定义了1个向量,该向量由4个分量组成。


每个在Shader中的属性是依据属性的名字来引用的(在Unity3d中,通常属性名是以下划线开头)。属性的名字将在材质检索器中显示。每一个属性的默认值为等号后的值。

Range和Float属性仅仅是1个数字。
Color和Vector属性由4个数字组成。

纹理属性(2D,Rect,Cube)的默认值是1个字符串,或者是默认的内置纹理:"白色","黑色","灰色","凸点"。


要在Shader编程中访问属性可以用属性名加方括号来访问如:[name];

Properties {
    // properties for water shader
    _WaveScale ("Wave scale", Range (0.02,0.15)) = 0.07 // sliders滑块
    _ReflDistort ("Reflection distort", Range (0,1.5)) = 0.5
    _RefrDistort ("Refraction distort", Range (0,1.5)) = 0.4
    _RefrColor ("Refraction color", Color)  = (.34, .85, .92, 1) // color颜色
    _ReflectionTex ("Environment Reflection", 2D) = "" {} // textures纹理
    _RefractionTex ("Environment Refraction", 2D) = "" {}
    _Fresnel ("Fresnel (A) ", 2D) = "" {}
    _BumpMap ("Bumpmap (RGB) ", 2D) = "" {}
}
纹理属性的花括号内的选项是可选的。可用的选项是:

TexGen texgenmode 纹理坐标自动生成模式

纹理坐标自动生成模式。可以是ObjectLinear,EyeLinear , SphereMap, CubeReflect,CubeNormal之一,这些直接对应到OpenGL texgen模式的。注意:如果使用自定义的顶点程序,TexGen被忽略。


LightmapMode 光照模式

如果给定的,这种纹理将受到预渲染的光照参数影响。也就是说,这种纹理的使用效果不是取决于材质,而是取决于渲染设置。详情请参考渲染脚本文件。

// EyeLinear texgen mode example
Shader "Texgen/Eye Linear" {
    Properties {
        _MainTex ("Base", 2D) = "white" { TexGen EyeLinear }
    }
    SubShader {
        Pass {
            SetTexture [_MainTex] { combine texture }
        }
    }
} 


2、SubShader

每个在Unity3D的shader都是由一系列的的subshaders组成的。当Unity3D显示一个网格的时候,它会使用第一个被用户显卡支持的subshader。

Subshader { [Tags] [CommonState] Passdef [Passdef ...] }

定义subshade包含了可选的标签,常见的状态和通道定义列表。

一个subshader定义了1个渲染通道列表,并有选择地设置了这些通道的通常状态。此外,subshade也可以设置特定的标签。

当Unity3D选择1个subshader进行渲染的时候,他将优先渲染1个被每个通道所定义的对象(这个对象很可能是由光线交互决定的)。由于渲染每1个物体是个十分昂贵的操作,你得定义Shader可能操作的渲染通道数目尽可能的少。当然有时候某些华丽的效果在显卡上不可能只使用单通道,你就必须得使用多通道了。

每个通道的定义可以是1个regular Pass, 或 Use Pass  或 Grab Pass.

在一个通道定义中的任何声明,也可以出现在Subshader块。这样做能使所有的通道都能共享这些声明。

// ...
SubShader {
    Pass {
        Lighting Off
        SetTexture [_MainTex] {}
    }
}
// ...

这个subshader定义了1个单通道,这个单通道关闭了所有的灯光然后显示了1个名字叫_MainTex的纹理网格。

转自:http://www.j2megame.com