顶点-片段着色器基础(二)

本系列文章系学习 唐福幸《Unity ShaderLab 新手宝典》的笔记,包含个人理解,如有错误欢迎批评指出

4.3 CG语法基础

Unity Shader中,ShaderLab只是起到组织代码结构的作用,而真正实现渲染效果的是CG语言编写的

4.3.1 编译指令

CG程序片段嵌入在Pass中,夹在CGPROGRAM和ENDCG之间

Pass
{
	CGPROGRAM
	//编译指令
	#pragma vertex vert
	#pragma fragment frag
	#pragma target 3.5
	#pragma require integers 2darray instancing
	
	ENDCG
}

以上两条编译指令告诉Unity,vert函数包含顶点着色器的代码,frag函数包含片元(段)着色器的代码。

编译指令作用
#pragma vertex name定义顶点着色器的名称,通常使用vert
#pragma fragment name定义片元(段)着色器,通常使用frag
#pragma target number定义Shader要编译的目标级别,默认2.5
#pragma require 功能名称1 功能名称2…定义Shader要使用到的一些功能

#pragma target number

  • 设置高等级的编译目标等级意味着可以使用更高级的GPU功能
  • 同时也会导致在旧设备上无法使用
    详情参考

默认情况下,所有着色器程序都编译到所有支持的渲染器中。
也可以使用 #pragma only_renderers 或 #pragma exclude_renderers 指定要编译的渲染器

用法如下:

#pragma only_renderers d3d11
名称对应渲染平台
d3d11Direct3D 11/12
glcoreOpenGL 3.x/4.x
glesOpenGL ES 2.0
gles3OpenGL ES 3.x
metaliOS/Mac Metal
vulkanVulkan
d3d11_9xDirect3D 11 9.x 功能级别,通常在 WSA 平台上使用
xboxoneXbox One
ps4PlayStation 4
n3dsNintendo 3DS
wiiuNintendo Wii U

4.3.2 着色器函数

  1. 无返回值函数
Shader "test1/NewUnlitShader"
{
    Properties
    {
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            void vert(in float4 vertex : POSITION, out float4 position: SV_POSITION)
            {
                position = UnityObjectToClipPos(vertex);//将输入的vertex经过UnityObjectToClipPos把模型空间坐标转换成裁剪空间坐标,输出为float4类型
            }

            void frag(in float4 vertex : SV_POSITION, out fixed4 color : SV_TARGET)
            {
                color = fixed4(1,0,0,1);//不管输入,将输出的color赋值为RGBA=1,0,0,1红色
            }

            ENDCG
        }
    }
}

其中vert函数是无返回值的,它是通过out输出的
格式如下

void name(in 参数, out 参数)
{
//函数体
}

void: 表示无返回值
name: 自定义的函数名称,通过这个名称调用这个函数
in: 输入参数,语法为:in+数据类型+名称,一个函数可以有多个输入
out: 输出函数,语法为:out+数据类型+名称,一个函数可以有多个输出
注:关键词in可以省略,out不可

  1. 有返回值函数(效果同无返回值函数)
Shader "test1/NewUnlitShader2"
{
    Properties
    {
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            float4 vert(in float4 vertex : POSITION) : SV_POSITION
            {
                return UnityObjectToClipPos(vertex);
            }

            fixed4 frag(in float4 vertex : SV_POSITION) : SV_TARGET
            {
                return fixed4(1,0,0,1);
            }

            ENDCG
        }
    }
}

其中vert函数是有返回值的,它是通过return输出的,其属性于函数名前面的类型
格式如下

type name(in 参数, out 参数)
{
//函数体
}

顶点和片段函数中,输入、输出的数据类型如下

数据类型描述用途
fixed,fixed2,fixed3,fixed4低精度浮点数(11位精度),[-2.0, 2.0],精度为 1/256固定精度对于常规颜色(通常存储在常规纹理中)以及对它们执行简单运算非常有用
half,half2,half3,half4中精度浮点数(16位精度),[-60000, 60000],精度约为 3 位小数半精度对于短矢量、方向、对象空间位置、高动态范围颜色非常有用。
float,float2,float3,float4中精度浮点数(32位精度)通常用于世界空间位置、纹理坐标或涉及复杂函数(如三角函数或幂/取幂)的标量计算
struct结构体可以将多个变量进行整体打包
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值