关于Directx中shader的输入与输出

来源:互联网 发布:php 5.6 Oracle 编辑:程序博客网 时间:2024/05/22 12:49

关于shaderModel5.0中VertexShader与PixelShader的输入输出:

在sm_5_0中各阶段的输出与输入要完全按照对应关系对齐才能有效读取数据。如

VS_OUTPUT

{

float4 Pos : SV_POSITION;
float4 color : COLOR0;
float4 tex : TEXCOORD0;

float4 color2 : COLOR1;

}

struct PS_INPUT
{
float4 Pos : SV_POSITION;
float4 color : COLOR0;
float4 color2 : COLOR1;
float4 tex : TEXCOORD0;
};


在以前写direct9的时候这里的对应关系完全没什么问题。即out.Pos ->in.Pos; out.color->in.color; out.color2->in.color2; out.tex->in.tex,然而在DirectX11中使用sm5.0的时候这里的对应关系完全不对。进过测试发现对应关系为out.pos->in.pos; out.color->in.color;out.color2->in.tex; out.tex->in.color2,

从结果上来看这里的对应关系只与成员在struct中的位置有关系而与后面的semantic没太大关系。然而试过把后面的semantic去掉发现又编译不过。

对于这些现象的一些猜想:

1、在direct9时代包括shader中的constant 以及输入输出都是使用寄存器来实现的。因此无论在struct中个成员的排序如何都不会影响到最终的结果。每个成员的数据都是根据后面的semantic对应到相应的寄存器中去的。而在DirectX10以后弱化了寄存器的概念很多东西更多的是使用buffer来实现的。因此这个过程中为了效率是不是把shader的输入输出也是按buffer来处理的。把输出的结果和输入的数据都是按一个整体的buffer来传递每个成员变量都是按自身在buffer中的偏移来确定的,至于后面的semantic的多用好像就只有限制数据的量了。

个人建议:

以后写shader的时候把输入输出的struct搞一样吧。


原创粉丝点击