Unity Shader学习记录三 语义

学习unity shader的基本语法,尝试实现运用以实现效果

Unity Shader 应用=>顶点=>片元=>输出阶段中的经常使用的语义:[1]

.

1、从应用阶段传递模型数据到顶点着色器时Unity经常使用的语义

POSITION 模型空间中模型顶点坐标位置,通常是float4类型
NORMAL 顶点法线,通常是float3类型
TANGENT 顶点切线,通常是float3类型
TEXCOORDn 顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标以此类推,通常是float2或float4
COLOR 顶点的颜色,通常是float4或fixed4

2、从顶点着色器到片元着色器Unity经常使用的语义

SV_POSITION 裁剪空间中顶点坐标,结构体中必须有一个用该语义修饰的变量,等同于DirectX9中的POSITION,但最好使用SV_POSITION
COLOR0 通常用于修饰第一组顶点颜色,但不是必须的
COLOR1 通常用于修饰第二在顶点颜色,但不是必须的
TEXCOORD0~TEXCOORD7 通常用于修饰纹理坐标,但不是必须的
(补充说明:这些语义除了SV_POSITION比较特殊以外,其他的语义基本上没有明确的要求,可以储存任意数据到这些语义修饰的变量中。另外,通常我们习惯于用TEXCOORD0来修饰自定义的变量。)

3、片元着色器输出时Unity支持的语义

SV_Target 等同于DirectX9中的COLOR,但我们最好用SV_Target。表示的是将输出数据
传递给render_target(渲染目标)
DEPTH 片段的深度

实践题目一:一个标准的正方体,将六个面的颜色分别设置为(0或1,0或1,0或1)六种颜色。

知识点:1.NORMAL 顶点法线。2.step(a,b)函数,若a<=b返回1,否则返回0
代码:

            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag    

            struct a2v
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                fixed3 color : COLOR0;
            };

            v2f vert(a2v v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.color = v.normal + fixed3(1,1,1) * step(v.normal.x,0) * step(v.normal.y, 0) * step(v.normal.z, 0);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                fixed3 c = i.color;
                return fixed4(c,1);
            }

            ENDCG

原理:对于正方体,六个面的法线分别为:(1,0,0),(-1,0,0),(0,1,0),(0,-1,0),(0,0,-1),(0,0,1),欲将其转化为(1,0,0),(0,1,1),(0,1,0),(1,0,1),(1,1,0),(0,0,1),就是若 x<0 | y<0 | z<0,-1转为0,0转为-1,否则不变。
.

[1] 引用自博客:链接

Unity Shader语义是一种用于定义着色器代码中变量的标识符。它们可以提供有关变量的更多信息,例如变量的作用、数据类型和使用方式。使用着色器语义可以使着色器代码更加简洁、易于阅读,并增加可维护性和可扩展性。 在Unity中,着色器语义通常用于顶点着色器和片段着色器中。在顶点着色器中,通过使用语义变量,可以将模型空间下的顶点位置转换为裁剪空间下的位置,并对其他语义变量进行计算和赋值。 在代码中,UnityObjectToClipPos函数被用来进行模型空间到裁剪空间的转换。这个函数是Unity内置的函数,它将模型空间下的坐标转换为裁剪空间下的坐标。具体实现方式可能会因Unity版本和平台而有所不同,但使用方法是一致的。 除了顶点着色器,语义还可以在片段着色器中使用。比如,在一个完整的代码案例中,我们可以使用纹理坐标和法线语义来对表面进行着色。在表面着色器函数中,我们可以将纹理坐标和主纹理的颜色值赋值给表面输出结构体,还可以将法线向量从世界空间变换到切线空间,并对其他表面输出结构体的变量进行计算和赋值。 总之,Unity Shader语义为我们提供了一种方式来定义和使用着色器代码中的变量,使其更具可读性和可维护性,并且能够方便地与其他着色器和渲染管线进行交互,同时也可以更方便地与外部程序进行交互。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值