zoukankan      html  css  js  c++  java
  • 【Unity Shader】---UnityShader 提供的CG/HLSL语义

    一、语义的解释

           语义,其实就是一个赋给Shader输入和输出的字符串,这个字符串表达了这个参数的含义。通俗的讲
    这些语义可以让Shader知道从哪读取输送到哪里去,他们是在CG/HLSL的shader流水线中是不可避免。

           表示图元数据的含义(顶点的位置、法向量或者纹理信息),也表明这些图元数据存放的硬件资源。

    因为顶点着色器的输出即是片段着色器的输入,所以顶点着色器的输出必须和片段着色器的输入语义是

    一致的。语义是顶点程序和片段程序之间输入输出数据和寄存器之间的桥梁,因此语义只对这两个处理

    阶段有意义,并且只在入口函数才有效,在内部函数无效。语义概念的提出和图形流水线工作机制大有

    关系。从前面所讲的GPU 处理流程中可以看出,一个阶段处理数据,然后传输给下一个阶段,那么每个

    阶段之间的接口是如何确定的呢?例如:顶点处理器的输入数据是处于模型空间的顶点数据(位置、法

    向量),输出的是投影坐标和光照颜色;片段处理器要将光照颜色做为输入,问题是“片段处理器怎么知

    道光照颜色值的存放位置”。在高级语言中(C/C++),数据从接口的一端流向另一端,是因为提供了数

    据存放的内存位置(通常是指针信息);由于Cg 语言并不支持指针机制,且图形硬件处理过程中,数据

    通常暂存在寄存器中,故而在Cg 语言中,通过引入语义绑定(binding semantics)机制,指定数据存放

    的位置,实际上就是将输入输出数据和寄存器做一个映射关系(在OpenGL Cg profiles 中是这样的,但

    在DirectX-based Cgprofiles 中则并没有这种映射关系)。根据输入语义,图形处理器从某个寄存器取数

    据;然后再将处理好的数据,根据输出语义,放到指定的寄存器。

    二、从应用阶段传递模型数据到顶点着色器时Unity经常使用的语义
    语义 描述
    POSITION 模型空间中模型顶点坐标位置,通常是float4类型
    NORMAL 顶点法线,通常是float3类型
    TANGENT 顶点切线,通常是float3类型
    TEXCOORDn 顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标以此类推,通常是float2或float4
    COLOR 顶点的颜色,通常是float4或fixed4

    三、从顶点着色器到片元着色器Unity经常使用的语义
    语义 描述
    SV_POSITION 裁剪空间中顶点坐标,结构体中必须有一个用该语义修饰的变量
    等同于DirectX9中的POSITION,但最好使用SV_POSITION
    COLOR0 通常用于修饰第一组顶点颜色,但不是必须的
    COLOR1 通常用于修饰第二在顶点颜色,但不是必须的
    TEXCOORD0~TEXCOORD7 通常用于修饰纹理坐标,但不是必须的

    补充说明:这些语义除了SV_POSITION比较特殊以外,其他的语义基本上没有明确的要求,
    可以储存任意数据到这些语义修饰的变量中。另外,通常我们习惯于用
    TEXCOORD0来修饰自定义的变量。

    四、片元着色器输出时Unity支持的语义
    SV_Target 等同于DirectX9中的COLOR,但我们最好用SV_Target。表示的是将输出数据
    传递给render_target(渲染目标)

    DEPTH  片段的深度

  • 相关阅读:
    hdu 4768 Flyer 二分
    hdu 4767 Bell
    hdu 4759 Poker Shuffle 二进制
    uva 12589
    zoj 3057 Beans Game 博弈论
    poj 2480 Longge's problem 积性函数
    重新启程
    【Luogu P1502】 窗口的星星
    【BZOJ1855】[Scoi2010] 股票交易
    【BZOJ1122】[POI2008] 账本BBB
  • 原文地址:https://www.cnblogs.com/nanwei/p/7193768.html
Copyright © 2011-2022 走看看