shader中的变量和语义

     在shader主函数的输入变量必须是用语义或者uniform关键字标记的.否则,将会出现编译错误.输入语义是用来联系shader的给定输入与渲染管线中相应输出的.比如,语义POSITION0就是用来指定来自顶点缓冲相应位置数据的.

    由于功能不同,象素与顶点渲染器有不同的输入语义集.顶点渲染器的输入语义用来描述每一个顶点的信息,比如位置,法线,象素纹理,颜色,切线,次法线等.输入语义是直接映射于顶点声明(vertex declaration)中的usage和usage index部分,因此,想要了解顶点输入的语义,建议先看一下顶点声明的相关概念,注意,既然用可编程管线,就应该忘记灵活顶点格式(FVF).

    象素渲染器语义是用来描述由光栅器单元产生的每个象素的信息的.所有的数据是由顶点渲染器输入的相应数据插值而成的,因为一个图元只有几个顶点,但是却覆盖了一大片象素,因此顶点之间的象素信息就需要权衡各顶点之间的结果来确定.

    输入语义可以使用两种方法来指定:

    (1)在参数声明后附加冒号与语义名字.

    (2)定义一个输入结构,在结构成员后附加冒号与语义名字

    顶点与象素渲染器为渲染管线的下一阶段提供数据.输出语义用来指定产生的数据怎样与下一阶段的输入相映射.比如,顶点渲染器的输出语义用来为光栅器的插值器提供相应数据,而象素渲染器的输出则为为每个渲染对象的alpha混合和深度缓冲更新提供相应数据.

 

    一个使用输入输出结构的shader示例: 

vector vClr;

struct VS_INPUT
{
    float4 vPosition : POSITION;
    float3 vNormal : NORMAL;
    float4 vBlendWeights : BLENDWEIGHT;
};

struct VS_OUTPUT
{
    float4  vPosition : POSITION;
    float4  vDiffuse : COLOR;

};

float4x4 mWld1;
float4x4 mWld2;
float4x4 mWld3;
float4x4 mWld4;

float Len;
float4 vLight;

float4x4 mTot;

VS_OUTPUT VS_Skinning_Example(const VS_INPUT v, uniform float len=100)
{
    VS_OUTPUT out;

    // Skin position (to world space)
    float3 vPosition = 
        mul(v.vPosition, (float4x3) mWld1) * v.vBlendWeights.x +
        mul(v.vPosition, (float4x3) mWld2) * v.vBlendWeights.y +
        mul(v.vPosition, (float4x3) mWld3) * v.vBlendWeights.z +
        mul(v.vPosition, (float4x3) mWld4) * v.vBlendWeights.w;
    // Skin normal (to world space)
    float3 vNormal =
        mul(v.vNormal, (float3x3) mWld1) * v.vBlendWeights.x + 
        mul(v.vNormal, (float3x3) mWld2) * v.vBlendWeights.y + 
        mul(v.vNormal, (float3x3) mWld3) * v.vBlendWeights.z + 
        mul(v.vNormal, (float3x3) mWld4) * v.vBlendWeights.w;
    
    // Output stuff
    out.vPosition    = mul(float4(vPosition + vNormal * Len, 1), mTot);
    out.vDiffuse  = dot(vLight,vNormal);

    return out;
}

   

    最后再次强烈建议在看语义之前去看看顶点声明中的D3DDECLUSAGE部分,在那里,你就会明白为什么顶点输入以后会有这样的映射结果,其实常用的FVF在也是在最后转变成顶点声明才进入Translation&Lighting阶段的.

Unity Shader语义是一种用于定义着色器代码中变量的标识符。它们可以提供有关变量的更多信息,例如变量的作用、数据类型使用方式。使用着色器语义可以使着色器代码更加简洁、易于阅读,并增加可维护性可扩展性。 在Unity中,着色器语义通常用于顶点着色器片段着色器中。在顶点着色器中,通过使用语义变量,可以将模型空间下的顶点位置转换为裁剪空间下的位置,并对其他语义变量进行计算赋值。 在代码中,UnityObjectToClipPos函数被用来进行模型空间到裁剪空间的转换。这个函数是Unity内置的函数,它将模型空间下的坐标转换为裁剪空间下的坐标。具体实现方式可能会因Unity版本平台而有所不同,但使用方法是一致的。 除了顶点着色器,语义还可以在片段着色器中使用。比如,在一个完整的代码案例中,我们可以使用纹理坐标法线语义来对表面进行着色。在表面着色器函数中,我们可以将纹理坐标主纹理的颜色值赋值给表面输出结构体,还可以将法线向量从世界空间变换到切线空间,并对其他表面输出结构体的变量进行计算赋值。 总之,Unity Shader语义为我们提供了一种方式来定义使用着色器代码中的变量,使其更具可读性可维护性,并且能够方便地与其他着色器渲染管线进行交互,同时也可以更方便地与外部程序进行交互。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值