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

Unity中Shader语义的理解

前言

        以下内容主要是个人理解,如有错误,欢迎严厉批评指正。

一、语义的形式在Shader中是必要的吗?

        不是必要的。

        使用HLSL和CG语言来编写Shader需要语义,使用GLSL编写Shader不需要。

二、语义的意义?

  • 语义是什么?        

        语义实际上是特定数据存储位置的标记。

  • vertex对应方法的输入结构体中的语义

        通常在  vertex  对应的方法(就是通常命名为 vert 或者 UnlitPassVertex 之类的那个方法)中使用的输入结构体中的语义与内容之间是严格相关的,参考下面的代码中的结构体:

struct attribute
{float3 posOS:POSITION;float2 uv:TEXCOORD0;
};

        在HLSL语言环境下,可以认为应用程序向GPU传递数据时,事先约定好在POSITION语义所对应的存储位置是存放模型基于自身坐标的顶点的位置信息。类似的,TEXCOORD0这个语义所对应的存储位置也是约定好存放模型默认的uv信息的。当一个结构体定义的目的是向  vertex  对应的方法中传递信息的时候,所有变量对于这些约定必须严格遵循,否则取不到正确的数据!

  • 从vertex对应的方法向fragment对应的方法传递内容的结构体中的语义

        如果定义的结构体的用途是将数据从vertex对应的方法处理好再传递给fragment对应的方法(就是通常命名为  frag 或者 UnlitPassFragment 的那个方法),就只有一个SV_POSITION语义是约定好的,这个语义对应的是顶点在裁剪空间中的位置。其它语义并没有约定,所谓语义只对应了一个存储位置,比如下面代码中的uv使用了语义TEXCOORD0,其实你使用NORMAL啥的也行。

struct Varying
{float4 posCS:SV_POSITION;float2 uv:TEXCOORD0;
};
  • fragment对应的方法的返回值的语义

        对于fragment对应的方法的返回值, SV_TARGET 的语义约定也是必须的,因为程序后续要在SV_TARGET所对应的存储位置取值。示例代码如下:

float4 frag(Varying IN):SV_TARGET
{float4 texColor = SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,IN.uv);return texColor * _MainColor;
}

常用语义:

        POSITION           表示这个变量用于存储模型基于自身坐标的顶点的位置信息。

        SV_POSITION    指定顶点的位置,通常用于顶点着色器输入。

        SV_TARGET       指定像素颜色输出的目标缓冲区,通常用于像素着色器输出。

        TEXCOORD        指定纹理坐标,用于从纹理中采样颜色。

        COLOR                指定顶点或像素的颜色。

        NORMAL             指定顶点或像素的法线向量。

        TANGENT           指定顶点或像素的切线向量。

        BINORMAL         指定顶点或像素的副法线向量。

        DEPTH                深度值

http://www.lryc.cn/news/261711.html

相关文章:

  • Flink系列之:Top-N
  • CSS的三大特性(层叠性、继承性、优先级---------很重要)
  • 飞天使-docker知识点10-docker总结
  • 旅游管理虚拟情景实训教学系统演示
  • Linux Shell——输入输出命令详解
  • MFC 第一个窗口程序
  • SQL语句的执行顺序怎么理解?
  • js解析.shp文件
  • 关于“Python”的核心知识点整理大全25
  • 代码随想录刷题题Day15
  • 软件设计师——信息安全(一)
  • git必须掌握:git远程变动怎么解决
  • Python里的时间模块
  • SCI一区级 | Matlab实现GWO-CNN-GRU-selfAttention多变量多步时间序列预测
  • C#学习相关系列之自定义遍历器
  • WPS没保存关闭了怎么恢复数据?3个方法,完成数据恢复!
  • 数据结构和算法-最小生成树(prim和krusakal)和最短路径问题(BFS和dijkastra和floyd)
  • 响应者链概述
  • ShenYu网关Http服务探活解析
  • 基于dockerfile搭建LNMP
  • 基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(三)
  • springMVC-@RequestMapping
  • 智能优化算法应用:基于树种算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • web前端项目-影视网站开发
  • QT:Unable to create a debugging engine.
  • 如何理解Rust语言中的“impl”关键字
  • C++实现简单的猜数字小游戏
  • 人工智能导论复习资料
  • Sentinel使用详解
  • Vue3源码梳理:响应式系统的前世今生