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中用强转或者自己算偏移量之类的方式来取用。

  • 相关阅读:
    java反射系七之动态代理
    java反射系列六之调用属性与方法
    java反射系列五之获取类的完整结构
    java反射系列四之创建运行时类的对象
    java反射系列三之类加载器
    java反射系列二
    java反射系列一
    数据类型
    类的加载、连接和初始化
    算法
  • 原文地址:https://www.cnblogs.com/AirGuanZ/p/7840137.html
Copyright © 2011-2022 走看看