MyShader3 基础小总结

前述

终于感觉有一丢丢入门shader了,这里总结一下

属性

在这里插入图片描述
简单来说,属性中的值可以在unity 的inspector面板中修改,当然是否有效就要看shader的编写了

案例

本章就通过这一个案例来阐述吧

Shader "Unlit/shader3"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Color ("Color",Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"
            //只有在CGPROGRAM 定义一个与属性块类型名字相同的变量,properties中的才会起作用
            fixed4 _Color;

            struct a2v{

                float4 v:POSITION;//用模型顶点填充v变量
                float3 n:NORMAL;//法线是三维的,用模型的法线填充n
                float4 texcoord: TEXCOORD0;//用模型的第一套UV 填充texcoord
            };

            struct v2f{ //顶点着色器到片元着色器

                float4 pos:SV_POSITION;//裁剪空间中的位置信息
                fixed3 color:COLOR0;//可以储存颜色信息
            };

            v2f vert(a2v av)
            {
                v2f frame;
                frame.pos = UnityObjectToClipPos(av.v);
                frame.color = av.n*0.5+fixed3(0.5,0.5,0.5);
                return frame;
            }

            fixed4 frag(v2f i):SV_TARGET
            {
                fixed3 c = i.color;
                c *= _Color.rgb;
                return fixed4(c,1);
            }

            ENDCG
        }
    }
}

案例分析

  1. 关于属性的使用,要在代码块中定义:
    fixed4 _Color;

_Color 是和属性中的命名保持一致才可以使用。
当然代码块中没有设置_Color 时,在面板调节属性颜色值是无效的

  1. UnityObjectToClipPos 这个是一个相对较新的使用吧
    啥意思呢:

In the past, we uses mul(UNITY_MATRIX_MVP, v.vertex) to convert vertex position from local to world space. v.vertex is float4 which has w component.
But in most cases w is = 1. To make vertex shader run faster, Unity replaced it with UnityObjectToClipPos(float3 pos), which ignores w component even you pass a float4 position instead of float3.
For some advanced users who still need the w component in their custom shaders, here is a cheaper UnityObjectToClipPos() function which respects the w component!

简单来说就是把局部空间转换成世界空间
可以借鉴一下这个链接
内置矩阵

  1. a2v 是一个结构体 表示的是 应用到顶点着色器
    里面传递的值也可以理解为顶点着色器到片元着色器的输入

  2. v2f 也是一个结构体,表示的是定点着色器到片元着色器
    关于这些定义可以看一下图形学那章,对于图形学的实现有一个大概的了解

5._Color.rgb
其中的rgb 就是红绿蓝,嗯~ rab 就是红 透明度 蓝 嘻嘻

关于输入输出中的属性呢 有一个常用的调用:

在这里插入图片描述

在这里插入图片描述
关于shader model 那个先忽略
知乎上的阐述是
SM是微软提出的,要求显卡厂商提供对应的功能和指令的支持。不同的SM包含不同的指令集和shader相关规范,高版本的SM往往是低版本的超集。

SM针对是HLSL,和GLSL没有关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值