unityshader自己学习笔记--基础知识--surface实现颜色改变

框架

开头

unity自带的框架,用于创建

Shader "ShaderLab学习/Shader01"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1y2Zk9vz-1681326648370)(image-20230302114751585.png)]

属性

属性,这里是暴露给外部交互的属性,可以是图片,颜色,数值等等

Properties
{

}
书写格式

shader中类比c++,书写格式会有所不一样

c++

color _Color = ragb(1.0,1.0,1.0,1.0);//颜色

而shader中格式为:

属性名(“属性说明”,属性类型) = 属性默认值

        _Color("颜色",color) = (1.0,1.0,1.0,1.0)

当然,也有一些特殊的写法

滑块条

        _Amount("法线扩张程度",Range(-1,1))=0.0

Range是float类型以范围的方式用滑块条表现的特殊形式

_Light("亮度",Range(0,1)) = 1.0

SubShader

Tags

渲染标记,此处是将渲染的物体标记为不透明物体

Tags { "RenderType"="Opaque" }
LOD
Pass

一个pass表示一次渲染的过程,一个subshader中可以有多个pass

顶点着色器,片元着色器

这两个函数是没有默认函数的,哪怕最简单的函数也需要自己写一个

用于处理每一个片元和每一个顶点

//表示开始shader代码编程
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
变量

如果在属性中写了属性值,需要在这里定义同名的变量才能在Shader中使用

但是如果为私有变量,可以直接在这里定义,而不需要在属性中定义

fixed4 _Color;
half _Light;
定义的函数
POSITION 、 SV_POSITION 表示语义

POSITION 表示模型空间顶点位置

SV_POSITION 表示投影空间的顶点位置

下方顶尖函数的意思是:传入一个模型空间的函数,转出一个投影空间的函数

片元函数的为:颜色乘亮度值

            float4 vert (float4 v:POSITION):SV_POSITION
            {
                //直接调用Unity提供的函数转换到投影空间
                return UnityObjectToClipPos(v);
            }

            //指定的片元着色器
            //SV_Target 表示最后输出的颜色
            fixed4 frag () : SV_Target
            {
                return _Color * _Light;
            }

这个shader的效果为颜色的变化跟着亮度走

在这里插入图片描述

完整案例

Shader "ShaderLab学习/Shader01"
{

    //属性,这里是暴露给外部交互的属性,可以是图片,颜色,数值等等
    Properties
    {
        //类比C++中定义变量的格式
        //color _Color = ragb(1.0,1.0,1.0,1.0);//颜色
        //属性定义的方式
        //属性名("属性说明",属性类型) = 属性默认值
        _Color("颜色",color) = (1.0,1.0,1.0,1.0)

        //Range是float类型以范围的方式用滑块条表现的特殊形式
        _Light("亮度",Range(0,1)) = 1.0
    }

    SubShader
    {
        //渲染标记,此处是将渲染的物体标记为不透明物体 
        Tags { "RenderType"="Opaque" }
        LOD 100
        //UnityShaderLab中LOD的作用
        //https://blog.csdn.net/linjf520/article/details/117651726

        //UnityShader学习参考
        //https://www.zhihu.com/column/c_1545188441411055618

        //一个pass表示一次渲染的过程,一个subshader中可以有多个pass
        Pass
        {
            //表示开始shader代码编程
            CGPROGRAM
            //指定顶点着色器函数 vert
            #pragma vertex vert
            //指定片元着色器函数 frag 
            #pragma fragment frag

            //如果在属性中写了属性值,需要在这里定义同名的变量才能在Shader中使用
            fixed4 _Color;
            half _Light;

            /*
            fixed half float 都表示浮点数
            float 单精度浮点数
            half 表示的是半精度浮点数
            fixed 定点数
            浮点数后面跟数字表示有多少个浮点数
            float  一个浮点数
            float2 表示两个浮点数 也可以表示二维向量 float2 a; a.x a.y 分别访问对应float
            float3x3 可以人为是二维数组也可以是矩阵
            */
            //指定的顶点着色器函数
            //POSITION 、 SV_POSITION 表示语义
            //POSITION 表示模型空间顶点位置
            //SV_POSITION 表示投影空间的顶点位置
            float4 vert (float4 v:POSITION):SV_POSITION
            {
                //直接调用Unity提供的函数转换到投影空间
                return UnityObjectToClipPos(v);
            }

            //指定的片元着色器
            //SV_Target 表示最后输出的颜色
            fixed4 frag () : SV_Target
            {
                return _Color * _Light;
            }
            ENDCG
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值