ShaderLab学习小结(八)在标准表面shader中加入顶点着色器函数

news/2024/7/5 2:12:36

场景中新建cube,和一个plane,新建一个standard surface shader和用此shader的材质赋给cube。
在不改变这个标准表面shader原有元素的基础上加入顶点程序,实现”ShaderLab学习小结(七)用插值函数lerp渐变颜色“中的颜色渐变,如下图:
ShaderLab学习小结(八)在标准表面shader中加入顶点着色器函数

shader代码:

Shader "Custom/TestCarPaintShader" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness("Smoothness", Range(0,1)) = 0.5
        _Metallic("Metallic", Range(0,1)) = 0.0

        //1.以下四个属性为新加入的实现渐变色属性(参见学习小结(七))
        _Center("Center", range(-120,420)) = 0
        _R("R",range(0,400)) = 0
        _MainColor("Main Color", color) = (0,0,1,1)
        _SecColor("Second Color", color) = (1,0,0,1)
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        //#pragma surface surf Standard fullforwardshadows     //2.
        #pragma surface surf Standard vertex:vert                       //3.

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        sampler2D _MainTex;
        float _Center;
        float _R;

        struct Input {
            float2 uv_MainTex;
            float x;                       //4.
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;
        fixed4 _SecColor;
        fixed4 _MainColor;

    //5.
        void vert(inout appdata_full v, out Input o)
        {
            o.uv_MainTex = v.texcoord.xy;
            o.x = v.vertex.y;
        }

        void surf (Input IN, inout SurfaceOutputStandard o) {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;

      o.Alpha = c.a;

            //6.
            float s = IN.x - (_Center - _R / 2);
            float f = saturate(s / _R);
            fixed4 col = lerp(_MainColor, _SecColor, f);
            o.Albedo *= col.rgb;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

如上,代码中用注释标注了六处

1

四个属性的声明,这个参见学习小结(七)

2和3

//#pragma surface surf Standard fullforwardshadows     //2.
    #pragma surface surf Standard vertex:vert                      //3.

原来的标准表面shader中用的是2,为了引入顶点程序,改为3

4

构造体

    struct Input {
            float2 uv_MainTex;
            float x;                       //4.
        };

参照学习小结(七),要实现x坐标或y坐标方向上的颜色渐变,需要一个值记录坐标,用于计算

5

加入顶点函数

 //5.
        void vert(inout appdata_full v, out Input o)
        {
            o.uv_MainTex = v.texcoord.xy;
            o.x = v.vertex.y;
        }

注意:void,即无返回值,函数的参数变成两个,输出Input o
同样,对o中的元素赋值,o.uv_MainTex,以及o.x。本例还是以y坐标来渐变,所以

o.x=v.vertex.y;

6

//6.
            float s = IN.x - (_Center - _R / 2);
            float f = saturate(s / _R);
            fixed4 col = lerp(_MainColor, _SecColor, f);
            o.Albedo *= col.rgb;

渐变计算,同学习小结(七)。唯一不同的是颜色的设置
o.Albedo,在标准着色器中,o.Albedo赋予的是材质的颜色,即前面

fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;

再和渐变计算出的颜色rgb相乘,得出最终颜色
我们这里没有设置材质贴图,原有的主颜色_Color保持默认的白色,就出来了图中的效果。
且这个shader保留了原有的表面着色器,包括贴图、光照、阴影、smoothness、metallic等属性,是在这些的基础上做出的颜色渐变。

转载于:https://blog.51cto.com/shuxiayeshou/2066463


http://www.niftyadmin.cn/n/4184463.html

相关文章

绝地求生国服推荐配置出炉,笔记本“吃鸡”的童鞋看这里!

近日,有消息称《绝地求生》国服有望在1月份上线,被大家热切猜测,屡屡被各大解说、主播爆料,甚至绝地求生的官微也调皮参与互动。且不说上线时间是否会如爆料所说如约而至,绝地求生官网出炉的推荐配置表,就勾…

【luogu P1865 A % B Problem】 题解

题目链接&#xff1a;https://www.luogu.org/problemnew/show/P1865 其实就是埃拉托色尼筛素数模板... 好像每个数暴力枚举到sqrt()也可以...就算当我无聊练手罢 1 #include <cstdio>2 #include <cmath>3 #include <algorithm>4 #include <cstring>5 u…

java异常之NoSuchMethodError

2019独角兽企业重金招聘Python工程师标准>>> 错误可能的原因 有这个类&#xff0c;该类真的没有这个方法依赖版本升级问题有这个类&#xff0c;而且有好几个&#xff0c;他们之间发生了冲突引入依赖的二次冲突不同依赖均有这个类&#xff08;包名和类名一致&#xf…

ASP.NET Core 2.0 : 五.服务是如何加载并运行的, Kestrel、配置与环境

"跨平台"后的ASP.Net Core是如何接收并处理请求的呢? 它的运行和处理机制和之前有什么不同? 本章从"宏观"到"微观"地看一下它的结构以及不同时期都干了些什么. ASP.NET Core 系列目录 本章主要内容如下: ASP.NET Core 的运行机制: "宏观&…

最简单的SpringMvc+Spring+Mybatis+Mysql+Dubbo案例

1.新建一个maven的web项目&#xff0c;项目结构和pom文件如下&#xff1a;<project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http…

Jquery.cookie.js

Cookies 定义&#xff1a;让网站服务器把少量数据储存到客户端的硬盘或内存&#xff0c;从客户端的硬盘读取数据的一种技术&#xff1b; 下载与引入:jquery.cookie.js基于jquery&#xff1b;先引入jquery&#xff0c;再引入&#xff1a;jquery.cookie.js&#xff1b;下载&#…

循环练习记录

用IntelliJ IDEA写的代码。import java.util.Scanner;/** * 循环训练 * 1.计算123..100的和&#xff1b; 2.计算n!&#xff1b; 3.根据出入的年、月、日计算这一天星期几 */public class XunHuan { /** * 计算123..100的和 * param */ static int s…

蓝牙扫描工具btscanner修复暴力扫描模式

蓝牙扫描工具btscanner修复暴力扫描模式在btscanner 2.1-5版本中&#xff0c;当用户按下快捷键b&#xff0c;执行暴力扫描模式&#xff0c;会出现程序奔溃问题。该问题现在已经修复。用户只需要更新系统&#xff0c;将btscanner更新到2.1-6即可。转载于:https://www.cnblogs.co…