当前位置: 首页 > news >正文

顶点着色器和片元着色器染色+表面体着色器染色

顶点/片元着色器染色

创建材质球及Shader同名文件VFColor

//Update NOTE:replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "CreateTest/VFColor"
{Properties{_Color("颜色",Color)=(1,1,1,1)}SubShader{Pass{//顶点片元着色器要写在Pass通道内CGPROGRAM  //Cg语言开始的定界符#pragma vertex vert  //通过Cg命令,设定vert()函数为顶点着色器调用的回调函数#pragma fragment frag  //通过Cg命令,设定frag()函数为片元着色器调用的回调函数//如果在Cg语言中,需要材质球的属性值,则需要导入变量fixed4 _Color;//变量名称,需要与材质中属性的名称,保持一致//GPU在几何阶段运行的回调函数(顶点着色器)//要做什么?将模型空间下的点,转换到裁剪空间下//要传入什么?CPU传递过来的模型空间下的点的位置,传出是什么?点在裁剪空间下点的位置//POSITION语义,告诉GPU,你将模型空间下的点的位置,赋值到v变量中//SV_POSITION语义,告诉GPU,我将计算后的裁剪空间下的点的位置,放在了函数返回值中float4 vert(float4 v:POSITION): SV_POSITION{//矩阵运算做坐标转换//Unity的内置矩阵UNITY_MATRIX_MVP,可以将点从模型空间,转换到裁剪空间下//返回就会把数据传回GPU,继续执行渲染流水线return UnityObjectToClipPos(v);}//GPU在光栅化阶段运行的回调函数(片元着色器)//要做什么?给物体上的所有顶点进行染色//传入是什么?顶点着色器经过计算后,点在裁剪空间下的位置。         //传出是什么?需要渲染的点的颜色//SV_POSITION语义:告诉GPU,你将顶点着色器算出来的裁剪空间下的点的位置//赋值在v变量中//SV_Target语义:告诉GPU,我当前要显示的点的颜色值是多少,你显示出来fixed4 frag(float4 v:SV_POSITION): SV_Target{return _Color;}ENDCG  //Cg语言结束的定界符}}Fallback "Diffuse"
}
表面体着色器染色

创建材质球及Shader同名文件SurfaceColor(Shader文件选择Standard Surface Shader)

编写相关代码如下所示:

Shader "CreateTest/SurfaceColor"
{Properties{_Color("颜色",Color)=(1,1,1,1)}SubShader{CGPROGRAM//设定表面体着色器的回调函数为surf(),并且使用标准光照#pragma surface surf Standard//设定表面体着色器最低的DirectX版本为9.0#pragma target 3.0//表面体着色器传递过来的纹理的UV坐标数据struct Input{float2 uv_MainTex;};fixed4 _Color;//表面体着色器(基于VF封装)//参数1:从CPU获得的数据//参数2:SurfaceOutputStandard是表面体着色器定义的标准Shader的返回值结构//如果要实现效果,只需要找到对应的属性,进行赋值即可void surf(Input IN,inout SurfaceOutputStandard o){//Albedo是SurfaceOutputStandard定义的修改颜色的属性//_Color.rgb是取属性中配置的颜色的rgb分量,是fixed3o.Albedo=_Color.rgb;//Alpha是SurfaceOutputStandard定义的修改透明度的属性o.Alpha=_Color.a;}ENDCG}Fallback "Diffuse"
}
实现去色相关Shader

相关代码如下:

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "CreateTest/Gray" {Properties{_MainTex("Base (RGB)", 2D) = "white" {}}SubShader{Pass{CGPROGRAM#pragma vertex vert    #pragma fragment frag    #include "UnityCG.cginc" sampler2D _MainTex;struct vertexOutput {float4 pos : SV_POSITION;float4 tex : TEXCOORD0;};vertexOutput vert(appdata_full input){vertexOutput output;output.pos = UnityObjectToClipPos(input.vertex);output.tex = input.texcoord;return output;}float4 frag(vertexOutput input) : COLOR{float4 col = tex2D(_MainTex, input.tex);//参考UnityCG.cginc中的Luminancefloat grey = dot(col.rgb, fixed3(0.22, 0.707, 0.071));col.rgb = float3(grey, grey, grey);return col;}ENDCG}}//如果以上SubShader渲染失败则回滚采用Diffuse    FallBack "Diffuse"
}

猜测修改Unity的内置图片Shader,将颜色rgb运算后,会得到这个结果。

去色效果如图:

快速编写相关Shader的代码思路

1.官网内置Shader包(www.unity3d.com最下方,旧版本下载)

2.根据组件使用的Shader到内置包中找Shader源文件

   根据Shader内部名称,定位到Shader文件

3.导入项目,修改Shader名称

4.能够被Image显示

   建立材质球

   将材质球与Shader关联

   将材质球,挂载Image组件上

5.实现相关功能

 该系列专栏为网课课程笔记,仅用于学习参考。

相关文章:

  • 《企业级 Java EE 架构设计精深实践》内容详解
  • 监听退出事件
  • 系统架构设计(三):质量属性
  • 扩展和自定义 asammdf 库:满足特定需求的解决方案
  • 如何创建一个C#项目(基于VS2022版)
  • 前端面试 HTML篇
  • 从像素到驾驶决策:Python与OpenCV赋能自动驾驶图像识别
  • PotPlayer,强大的高清视频播放器
  • MySQL 联合查询教程
  • STM32的开发环境介绍
  • C++如何设计线程池(thread pool)来提高线程的复用率,减少线程创建和销毁的开销
  • Vue3的内置组件 -实现过渡动画 TransitionGroup
  • 实现从一个微信小程序跳转到另一个微信小程序
  • 文本预处理(NLTK)
  • 达芬奇模板 15组现代简洁文字标题动画 Modern Titles v2.0 DR
  • 在Spring Boot项目中实现Word转PDF并预览
  • 路由交换网络专题 | 第八章 | GVRP配置 | 端口安全 | 端口隔离 | Mux-VLAN | Hybrid
  • 数字孪生:从概念验证到产业革命的十年征程
  • 【Castle-X机器人】三、紫外消杀模块安装与调试
  • 前端节流、防抖函数
  • “90后”樊鑫履新乌兰察布市察右中旗副旗长人选
  • 中国贸促会:有近50%的外贸企业表示将减少对美业务
  • 没有雷军的车展:老外扎堆,萌车、机器狗谁更抢镜?| 湃客Talk
  • 仲裁法修订草案二审稿拟增加规定规制虚假仲裁
  • 民航局:预计五一假期民航旅客运输量创同期历史新高,将加强价格管理
  • 规范涉企案件审判执行工作,最高法今天发布通知