zoukankan      html  css  js  c++  java
  • HLSL中constant variables的packing规则

    HLSL中constant variables的packing规则


    参考MSDN上的官方文档。一般而言,HLSL将数据打包为4字节对齐,此外,它不允许数据跨16字节(即4个float的vector)的访问。这个“此外”是我比较关心的,对使用者最直接的影响就是用constant buffer进行应用程序和shader间的交互的时候,应用程序这边的数据也要手动做符合16字节的对齐规则。比如在shader里面写:

    cbuffer constantValues
    {
        float2 Val0;
        float4 Val1;
        float2 Val2;
    };
    

    它实际上会占用3个16字节那么大的空间,C++这边对应的结构可以这样:

    struct ConstantBufferType
    {
    	vectorOfFloat2 val0;
      	float pad0;
      	float pad1;
      	vectorOfFloat4 val1;
      	vectorOfFloat2 val2;
      	float pad2;
      	float pad3; 
    };
    

    如果naive地写:

    struct ConstantBufferType
    {
      	vectorOfFloat2 val0;
      	vectorOfFloat4 val1;
      	vectorOfFloat2 val2;
    };
    

    就挂了。

    最后,HLSL中的数组默认是不packing的,每个元素都直接被装在16字节的空间中,想packing的话就需要精心地安排数据存储并在shader中用强转或者自己算偏移量之类的方式来取用。

  • 相关阅读:
    poj 3159 Candies
    强连通分量——Tarjan算法
    nyoj 次方求模
    nyoj 快速查找素数
    nyoj 光棍节的快乐
    拓扑排序
    快速幂取模
    nyoj 最大素因子
    素数打表
    nyoj 数的长度
  • 原文地址:https://www.cnblogs.com/AirGuanZ/p/7840137.html
Copyright © 2011-2022 走看看