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

UnityShader入门精要-系统语义与函数体

系统语义与函数体

系统语义标记,指该类型将返回给流水线GPU做处理。

结构体做返回值时,不需要在函数头标记系统语义。结构体外部和内部的标记会产生二义性,所以新版本只能在内部声明

原版错误

Shader "Unity Shaders Book/Chapter 5/Simple Shader" {Properties {// 声明一个Color类型的属性_Color ("Color Tint", Color) = (1.0,1.0,1.0,1.0)}SubShader {Pass {CGPROGRAM#pragma vertex vert#pragma fragment frag// 在Cg代码中,我们需要定义一个与属性名称和类型都匹配的变量fixed4 _Color;struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;float4 texcoord : TEXCOORD0;};struct v2f {float4 pos : SV_POSITION;fixed3 color : COLOR0;};v2f vert(a2v v) : SV_POSITION {  // 错误,不能在外面声明,不再可以自动解构v2f o;o.pos = mul(UNITY_MATRIX_MVP, v.vertex);o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);return o;}fixed4 frag(v2f i) : SV_Target {fixed3 c = i.color;// 使用_Color属性来控制输出颜色c *= _Color.rgb;return fixed4(c, 1.0);}ENDCG}}
}

​- 不再容忍模糊或错误的语义使用​
​- 不允许给结构体整体标记语义(如 struct v2f : SV_POSITION)

mul 被遗弃,会自动转换为UnityObjectToClipPos

改正后

Shader "Unity Shaders Book/Chapter 5/Simple Shader" {Properties {// 声明一个Color类型的属性_Color ("Color Tint", Color) = (1.0,1.0,1.0,1.0)}SubShader {Pass {CGPROGRAM#pragma vertex vert#pragma fragment frag// 在Cg代码中,我们需要定义一个与属性名称和类型都匹配的变量fixed4 _Color;struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;float4 texcoord : TEXCOORD0;};struct v2f {float4 pos : SV_POSITION;fixed3 color : COLOR0;};v2f vert(a2v v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);return o;}fixed4 frag(v2f i) : SV_Target {fixed3 c = i.color;// 使用_Color属性来控制输出颜色c *= _Color.rgb;return fixed4(c, 1.0);}ENDCG}}
}

传入的结构体系统语义会被GPU捕捉赋值,返回的结构体的系统语义会被自动解构获取

也就是说,两种函数头

结构体内部标记系统语义,函数头不再声明

struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;float4 texcoord : TEXCOORD0;
};struct v2f {float4 pos : SV_POSITION;fixed3 color : COLOR0;
};v2f vert(a2v v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);return o;
}

或者基本类型系统语义在函数头标记

fixed4 frag(v2f i) : SV_Target {fixed3 c = i.color;// 使用_Color属性来控制输出颜色c *= _Color.rgb;return fixed4(c, 1.0);
}
http://www.hskmm.com/?act=detail&tid=24923

相关文章:

  • 从价值博弈到价值原语博弈的跃迁:降维解析与升维求解的工程实现——声明Ai研究
  • 动归集训
  • 轻松发现开放重定向漏洞:从参数到Payload的完整指南
  • 记一次安装fail2ban - Lizo
  • 2022_easyRSA
  • 2025电缆厂家最新推荐排行榜:深度解析青岛一缆等六家优质企业实力,助力精准选购
  • 1 洛谷题解修正器
  • 防止语言模型性能倒退的新方法
  • Delphi 解决IniFiles中文乱码
  • Tarjan详解
  • RAG入门 - Retriever(1) - 指南
  • 分布式微服务系统架构第142集:全栈构建
  • 2025 年电永磁吊具制造厂家 TOP 企业品牌推荐排行榜全新发布,含大型电永磁吊具,全覆盖,起重,小型,钢板,钢板电永磁吊具公司推荐!
  • QBXT2025S刷题 Day4题
  • 实用指南:云原生时代 Kafka 深度实践:03进阶特性与最佳实践
  • 【VM虚拟机】VM新版本,虚拟机中键盘输入延迟卡顿
  • 2025石灰源头厂家最新推荐榜单:深度解析生石灰,熟石灰物流效率与综合实力
  • AtCoder Beginner Contest 426 游记
  • 如何把MCP服务集成到智能体?手把手教学(含视频教程)
  • bootimg.exe检查验证备份导出的img镜像文件是否正常
  • 华为云Flexus+DeepSeek征文|华为云Flexus服务器dify高效的平台通过自然语言转sql并执行搭建电商数据分析
  • 《独立开发者精选工具》第 019 期
  • 活着,就像明天就要死去一样
  • vue漏洞
  • 网站第一开在浏览器中打开慢的原因
  • [JVM] JVM内存调优 - 教程
  • 全面解析DoS攻击防护与应对策略
  • day16 课程(面向对象三大特性:继承 多态 属性)
  • C++ Vector算法精讲与底层探秘:从经典例题到性能优化全解析 - 指南