码迷,mamicode.com
首页 > 其他好文 > 详细

Unity3D中的Shader

时间:2014-07-16 15:57:38      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   for   io   

简单的说,Shader是为渲染管线中的特定处理阶段提供算法的一段代码。Shader是伴随着可编程渲染管线出现的,从而可以对渲染过程加以控制。

1. Unity提供了很多内建的Shader,这些可以从官网下载,打开looking for older version的链接就能看到Build-in shaders。选择合适的Shader很重要,以下是开销从低到高的排序:

(1)Unlit:仅使用纹理颜色,不受光照影响

(2)VertexLit:顶点光照

(3)Diffuse:漫反射

(4)Specular:在漫反射基础上增加高光计算

(5)Normal mapped:法线贴图,增加了一张法线贴图和几个着色器指令

(6)Normal Mapped Specular:带高光法线贴图

(7)Parallax Normal Mapped:视差法线贴图,增加了视差贴图的计算开销

(8)Parallax Normal Mapped Specular:带高光视差法线贴图

  对于现在流行的移动平台游戏,Unity提供了几种专门的着色器放在Shader->Mobile下,它们是专门优化过的。

2. 在Unity中,可以编写3种类型的Shader:

表面着色器(Surface Shaders):最常用的Shader,可以与灯光、阴影、投影器交互,以Cg/HLSL语言进行编写。

顶点和片段着色器(Vertex and Fragment Shaders):全屏图像效果,代码比较多,以Cg/HLSL编写。

固定功能管线着色器(Fixed Function Shaders):游戏要运行在不支持可编程管线的老旧机器上时,需要用ShaderLab语言来编写。

无论编写哪种Shader,实际的Shader代码都需要嵌入ShaderLab代码中,Unity通过ShaderLab代码来组织Shader结构。

下面是我新建的一个Shader的默认内容:

Shader "Custom/TestShader" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        CGPROGRAM
        #pragma surface surf Lambert

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o) {
            half4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    } 
    FallBack "Diffuse"
}

Properties:用来定义着色器中使用的贴图资源或者数值参数等,这里定义了一个Base (RGB)的2D图片。

SubShader:一个着色器包含的一个或多个子着色器。Unity从上到下遍历子着色器,找到第一个能被设备支持的着色器。

FallBack:备用着色器,一个对硬件要求最低的Shader名字。

 

Unity3D中的Shader,布布扣,bubuko.com

Unity3D中的Shader

标签:style   blog   color   使用   for   io   

原文地址:http://www.cnblogs.com/shihui142857/p/3848580.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!