当前位置: 首页 > 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.实现相关功能

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

http://www.xdnf.cn/news/154621.html

相关文章:

  • 深入理解算力:从普通电脑到宏观计算世界
  • MySQL长事务的隐患:深入剖析与解决方案
  • 【Castle-X机器人】二、智能导览模块安装与调试
  • 【Castle-X机器人】四、智能机械臂安装与调试
  • 【C++】stack、queue和priority_queue的模拟实现
  • Android Compose 框架图像修饰深度剖析:从源码到实践(八)
  • ‌MySQL 事务隔离级别详解
  • 深入剖析 Vue 组件:从基础到实践
  • 5G融合消息PaaS项目深度解析 - Java架构师面试实战
  • Linux文件操作命令终极指南:从查看到高级搜索
  • 使用MobaXterm远程登录Ubuntu系统:SSH服务配置教程
  • 【Docker项目实战】使用Docker部署Caddy+vaultwarden密码管理工具(详细教程)
  • 【Linux网络】打造初级网络计算器 - 从协议设计到服务实现
  • 模态链:利用视觉-语言模型从多模态人类视频中学习操作程序
  • 有关图的类型的题目(1)
  • Linux下终端命令行安装常见字体示例
  • 基于亚马逊云科技构建音频转文本无服务器应用程序
  • 使用matplotlib绘制Raincloud图/云雨图/柱状图/小提琴图
  • 《代码之美:静态分析工具与 CI 集成详解》
  • 【虚幻C++笔记】碰撞检测
  • 探秘卷积神经网络:深度学习的图像识别利器
  • 【Linux网络】构建HTTP响应与请求处理系统 - HttpResponse从理解到实现
  • 常见的机器视觉通用软件
  • JDBC数据库操作中如何保证最后关闭了所占用的资源——try用法的细节控制
  • k8s中资源的介绍及标准资源namespaces实践
  • 如何在 Conda 环境中降级 Python 版本:详细指南
  • H.264/AVC标准主流开源编解码器编译说明
  • 2025第十六届蓝桥杯大赛(软件赛)网络安全赛 Writeup
  • MyBatis缓存配置的完整示例,包含一级缓存、二级缓存、自定义缓存策略等核心场景,并附详细注释和总结表格
  • Prometheus、Zabbix和Nagios针对100个节点的部署设计架构图