Shader概述

2019-10-22  本文已影响0人  最怕认真

什么是Shader

Shader(着色器)是一段能够针对3D对象进行操作、并被GPU所执行的程序。Shader并不是一个统一的标准,不同的图形接口的Shader并不相同。OpenGL的着色语言是GLSL, NVidia开发了Cg,而微软的Direct3D使用高级着色器语言(HLSL)。而Unity的Shader 是将传统的图形接口的Shader(由 Cg / HLSL编写)嵌入到独有的描述性结构中而形成的一种代码生成框架,最终会自动生成各硬件平台自己的Shader,从而实现跨平台。所以说Shaer其实就是一门语言,用来控制渲染的语言。

Shader种类

OpenGL和Direct3D都提供了三类着色器:

光栅化是将一个图元转变为一个二维图像的过程。二维图像上每个点都包含了颜色、深度和纹理数据。将该点和相关信息叫做一个片元(fragment)。
光栅化的目的,是找出一个几何单元(比如三角形)所覆盖的像素。


image.png

左侧有三个片元(三个顶点),将其光栅化,其实就是计算显示这个三角形需要多少个像素

Unity Shader 分为 表面着色器(Surface Shader)和 顶点片段着色器(Vertex And Fragment Shader):

在Unity中,顶点着色器是使用最为广泛的一种

Shader的结构

image.png
//Shader语法:
Shader "name" { [Properties] Subshaders [Fallback] [CustomEditor] }
 
//Properties 语法
Properties { Property [Property ...] }
 
// Subshader 语法
Subshader { [Tags] [CommonState] Passdef [Passdef ...] }
 
// Pass 语法
Pass { [Name and Tags] [RenderSetup] }
 
// Fallback 语法
Fallback "name"

Shader示例

基本的表面着色器

Shader "Custom/NewShader" {
        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"
    }

基本的顶点片段着色器

Shader "VertexInputSimple" {
  SubShader {
    Pass {
      CGPROGRAM
      #pragma vertex vert
      #pragma fragment frag
      #include "UnityCG.cginc"
 
      struct v2f {
          float4 pos : SV_POSITION;
          fixed4 color : COLOR;
      };
 
      v2f vert (appdata_base v)
      {
          v2f o;
          o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
          o.color.xyz = v.normal * 0.5 + 0.5;
          o.color.w = 1.0;
          return o;
      }
 
      fixed4 frag (v2f i) : SV_Target { return i.color; }
      ENDCG
    }
  } 
}
上一篇 下一篇

猜你喜欢

热点阅读