sampler2D、sampler3D与samplerCUBE
纹理,默认情况下在移动平台纹理会被自动转换成低精度的纹理类型,如果你需要中精度的或者高精度的需要用以下方式来声明:
sampler2D_half(中精度2D纹理)
sampler2D_float(高精度2D纹理)
sampler3D_half(中精度3D纹理)
sampler3D_float(高精度3D纹理)
samplerCUBE_halft(中精度立方体纹理)
samplerCUBE_float(高精度立方体纹理)
语义的作用:当应用阶段的数据传过来时,计算机根据语义标识的变量来传递数据
语义:
(顶点着色器)
float4 vertex : POSITION; //顶点
float4 tangent : TANGENT; //切线
float3 normal : NORMAL; //法线
float4 texcoord : TEXCOORD0; //UV1
float4 texcoord1 : TEXCOORD1; //UV2
float4 texcoord2 : TEXCOORD2; //UV3
float4 texcoord3 : TEXCOORD3; //UV4
fixed4 color : COLOR; //顶点色
(顶点着色器到片段着色器)
float4 pos:SV_POSITION;
TEXCOORD0~N系列:TEXCOORD0、TEXCOORD1、TEXCOORD2…等等,主要用于高精度数据。
COLOR0~N系列:COLOR0、COLOR1、COLOR2…等等,主要用于低精度数据。
虽然这两种语义我们可以根据需要自由定义,但是,它并不是可以无限定义的,不同的GPU硬件有不同的数量限制。
以下为手机平台的常见规则:OpenGL ES2.0支持最多8个、OpenGL ES3.0支持最多16个
从性能优化角度来讲,数量越少性能越好。另外,每个语义是4维向量,利用好这一点,可以大大节省总数量。
face:VFACE //如果渲染表面朝向摄像机,则Face节点输出正值1,如果远离摄像机,则输出负值-1。
(片断着色器)
通常情况下,片断着色器最终只需返回一个颜色值即可,也是我们最常见到的编写方式,如下:
fixed4 frag (v2f i ) : SV_TARGET
这里的SV_TARGET就是指定输出颜色到RenderTarget的语义,其实我们也可以采用Struct的方式,就是像应用阶段到顶点与顶点到片断一样,只是由于平时我们只需返回一个颜色所以就无需再用一个Struct了(你非要用也是可以的)。
当我们利用Struct时,就可以通过下列语义来输出多个内容:
SV_Target0?N
默认SV_TARGET0,也就是SV_TARGET,还有SV_TARGET1,SV_TARGET2…这个在需要输出多个RenderTarget时很有用。
SV_Depth
一般情况下,模型的像素深度值在光栅化时会自动插值计算得出,并不需要我们做额外的处理,但这并不代表不可以修改它,通过在片断着色器中输出SV_DEPTH语义可以更改像素的深度值。
1 | 注意此功能相对会消耗性能,在没有特别需求的情况下尽量不要用! |