我还没有在这里使用过像这样更复杂的 CB,但据我了解,我的 C++ 对齐和打包必须符合 HLSL 的预期。所以我正在尝试 figure out the rules所以我可以预测地布置 C++ struct 以匹配 HLSL 的预期。
我在 Vertex Shader v5 中进行了一些测试,以查看输出中产生的打包,并在 vs.hlsl 中使用了此结构:
cbuffer conbuf {
float m0;
float m1;
float4 m2;
bool m3[1];
bool m4[4];
float4 m5;
float m6;
float4 m7;
matrix m8;
float m9;
float m10;
float4 m11[2];
float m12[8];
float m13;
};
产生了以下输出(在 Header File Name VC++ Project HLSL Settings 中):
cbuffer conbuf {
float m0; // Offset: 0 Size: 4
float m1; // Offset: 4 Size: 4
float4 m2; // Offset: 16 Size: 16
bool m3; // Offset: 32 Size: 4
bool m4[4]; // Offset: 48 Size: 52
float4 m5; // Offset: 112 Size: 16
float m6; // Offset: 128 Size: 4
float4 m7; // Offset: 144 Size: 16
float4x4 m8; // Offset: 160 Size: 64
float m9; // Offset: 224 Size: 4
float m10; // Offset: 228 Size: 4
float4 m11[2]; // Offset: 240 Size: 32
float m12[8]; // Offset: 272 Size: 116
float m13; // Offset: 388 Size: 4
};
我很清楚偏移量是如何工作的(基于大小),但我无法理解数组大小。
这里的一些数组大小似乎是随机的。 我无法弄清楚 bool m4[4] 数组的大小如何:52。对于大小为 116 的 float m12[8] 也是如此。 HLSL 编译器如何设法生成这些大小?
有什么帮助吗? 我已经查看了 MSDN packing page但他们对数组的讨论不多。
最佳答案
我会稍微简化你的例子,因为你已经得到了填充。
根据打包规则(您提到的链接),数组的一个重要部分是:
Arrays are not packed in HLSL by default. To avoid forcing the shader to take on ALU overhead for offset computations, every element in an array is stored in a four-component vector.
让我们以这个简单的 cbuffer 为例:
cbuffer cbPerObj : register( b0 )
{
float Alpha[4];
};
根据上述规则(每个 float 存储在四个 vector 中),这将(几乎)等同于:
cbuffer cbPerObj : register( b0 )
{
float4 Alpha[4];
};
或(展开)
cbuffer cbPerObj : register( b0 )
{
float Alpha1;
float3 Dummy1;
float Alpha2;
float3 Dummy2;
float Alpha3;
float3 Dummy3;
float Alpha4;
};
正如您所注意到的,您的最后一个元素没有被填充,这就是为什么您会注意到您的情况:
bool m4[4]; // Offset: 48 Size: 52
float4 m5; // Offset: 112 Size: 16
m4 为 16*4 = 64(减去最后 3),64-12 = 52
当然你也可以注意到,48 + 52 = 100(因为m5不需要越界,所以你可以找到偏移量丢失的12个字节)
如果你有,
bool m4[4]; // Offset: 48 Size: 52
float m5;
m5 的偏移量为 100,因为它可以适应边界。
希望这是有道理的。
关于c++ - HLSL 常量缓冲区中数组的意外大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24276402/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到rubygems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是: