Unity | Shader基础知识(第三集:案例<对材质颜色进行干预>)

目录

一、本节介绍

[1 上集回顾](#1 上集回顾)

[2 本节介绍](#2 本节介绍)

二、理论介绍

三、对材质颜色进行干预的案例

[1 获取位置信息](#1 获取位置信息)

[2 处理颜色](#2 处理颜色)

四、本节全部代码

五、下集预告


一、本节介绍

1 上集回顾

上一集我们学到,shader的语法格式

2 本节介绍

这一集学习,第二简单的shader案例,对shader颜色的简单干预。

二、理论介绍

1 获取位置信息

Unity | Shader基础知识(什么是shader)_unity shader-CSDN博客

在这一文章中,我们可以看出,最初决定位置的叫顶点着色器,因为确定位置后才可以上色。

结论:我们可以在顶点着色器中干预上色的位置

2 改变颜色思路

上色的最后一步是在片元着色器(也叫像素着色器),我们可以不管它中间怎么运行的,我们在最后给他改颜色,显示出来的肯定会改。

三、对材质颜色进行干预的案例

本案例用到的语义:

:POSITION 获取到模型的顶点坐标

:SV_POSITION 输出给像素着色器的屏幕坐标

:SV_TARGET 输出值直接用于渲染了

1 获取位置信息

a.上文说过,我们需要在顶点着色器中获取模型的顶点位置信息

引入顶点位置信息代码:

cs 复制代码
Shader "Custom/001"
{
SubShader
    {
        pass
        {
            CGPROGRAM
            //引入vertex //起名叫vert
            #pragma vertex vert

            ENDCG
        }
    }
}

b.获取模型顶点位置

根据上文语义讲解部分,我们已经知道如何拿到模型顶点。

c.坐标转换

模型的顶点位置肯定是世界坐标下的,我们屏幕不一定能显示全面,我们的shader只需要管屏幕看得到的东西就够了,所以我们需要知道屏幕坐标下的位置信息。

结论:我们需要把世界坐标下的顶点位置,转换成屏幕坐标下的位置

方法:unity已经给我弄好了,直接用就可以

世界坐标转屏幕坐标代码如下:

cs 复制代码
//最后会得到,模型的屏幕坐标
UnityObjectToClipPos(这里输入模型的顶点世界坐标)

d.把转换好的坐标输出给像素着色器的屏幕坐标

上述功能代码汇总:

cs 复制代码
Shader "Custom/001"
{
SubShader
    {
        pass
        {
            CGPROGRAM
            //引入vertex //起名叫vert
            #pragma vertex vert
            
                        //引入模型顶点坐标    //return的值直接给到片元着色器的屏幕坐标
            float4 vert(float4 v :POSITION):SV_POSITION
            {
            //返回处理过的坐标数据
            return UnityObjectToClipPos(v);
            }
            ENDCG
        }
    }
}
2 处理颜色

a.引入片元着色器信息代码

cs 复制代码
//引入fragment //起名叫frag
#pragma fragment frag

b.修改颜色代码

因为片元着色器输出的直接是颜色了,我们假设想输出一个白色

cs 复制代码
//白色的写法(原因略)
fixed4(1,1,1,1)

片元着色器输出白色代码

cs 复制代码
//片元着色器方法  //直接输出渲染
float4 frag():SV_TARGET
{
    //输出白色
   return float4(1,1,1,1);
}

备注:

这里return 的数据,如果是都在0-1里面,默认0是黑色,1是白色。

如果是在0-255里,默认0是黑色,255是白色。

四、本节全部代码

cs 复制代码
Shader "Custom/001"
{
SubShader
    {
        pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

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

            float4 frag():SV_TARGET
            {
            return float4(1,1,1,1);
            }

            ENDCG
        }
    }
}

五、下集预告

下集会讲解shader语法,用结构体获取数据

相关推荐
UTwelve6 小时前
【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第一篇-原理】
ue5·ue4·虚幻·虚幻引擎·着色器
dangoxiba8 小时前
【Unity学习心得】如何使用Unity制作“饥荒”风格的俯视角2.5D游戏
游戏·unity·c#·游戏引擎
cyr___11 小时前
Unity教程(十六)敌人攻击状态的实现
学习·游戏·unity·游戏引擎
优梦创客19 小时前
《黑神话悟空》开发框架与战斗系统解析
unity·游戏开发·黑神话悟空·战斗系统·解包
仙魁XAN1 天前
Unity 设计模式 之 创造型模式-【工厂方法模式】【抽象工厂模式】
unity·设计模式·工厂方法模式·抽象工厂模式
我要吐泡泡了哦1 天前
GAMES104:15 游戏引擎的玩法系统基础-学习笔记
笔记·学习·游戏引擎
躺下睡觉~1 天前
Unity-Transform类-父子关系
java·unity·游戏引擎
躺下睡觉~1 天前
Unity-Transform类-缩放和看向
unity·游戏引擎
君莫愁。2 天前
【Unity】检测鼠标点击位置是否有2D对象
unity·c#·游戏引擎
咩咩觉主2 天前
Unity实战案例全解析:PVZ 植物卡片状态分析
unity·c#·游戏引擎