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

  • 相关阅读:
    IDA断点和搜索
    shell grep正则匹配汉字
    吐槽一下jsoup
    mysql函数
    hutools之批量更新
    Hutools之http工具类
    Java通过腾讯邮箱发送邮件
    访问网络资源的方式--application/json和x-www-form-urlencoded
    HttpClient获取数据
    URLConnection类的使用
  • 原文地址:https://www.cnblogs.com/AirGuanZ/p/7840137.html
Copyright © 2011-2022 走看看