- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个每个实例的统一缓冲区,其中缓冲区中的每个元素都是 64 字节,但我只使用顶点着色器中每个元素的前 16 字节 (float3)。我大步向前来描述这一点。问题是它不会跨过其他 48 个字节除非我在着色器中向结构添加填充,以便它也是 64 个字节。
// Particle Instance Position
vertexDescriptor.attributes[2].format = .Float3 // 16 bytes with padding.
vertexDescriptor.attributes[2].offset = 0
vertexDescriptor.attributes[2].bufferIndex = 2
vertexDescriptor.layouts[2].stride = strideof(Particle)
vertexDescriptor.layouts[2].stepFunction = .PerInstance
...
commandEncoder.setVertexBuffer(instanceUniformBuffer, offset:0, atIndex:2)
应用端粒子结构:
struct Particle {
var position = float3()
var prevPos = float3()
var attractPoint = float3()
var ref: DataRef!
var state = State.Free
enum State: Int {
case Free = 0
case Active
}
}
这里是对应的Metal结构,即Particle.position
对应shader中的InstanceUniforms.instanceTranslate
。我希望上面的步幅设置意味着这将加载每个实例的 Particle.position
并且跳过缓冲区中每个 Particle
的其他 48 个字节。
struct InstanceUniforms
{
float3 instanceTranslate [[ attribute(2) ]];
};
一些健全性检查,一切都有意义:
sizeof(float3) 16
alignof(float3) 16
sizeof(Particle) 57
alignof(Particle) 16
strideof(Particle) 64
但它不起作用,除非我将着色器结构填充到 64 字节:
struct InstanceUniforms
{
float3 instanceTranslate [[ attribute(2) ]];
float4 pad[3];
};
否则对于第二个实例,着色器实际上将 instanceTranslate
设置为缓冲区中 first 元素的 Particle.prevPos
,就像它一样跨越 InstanceUniforms
结构的大小,无论在顶点描述符中设置的步幅如何。
我敢肯定我一定是在这里做错了什么,看起来你不应该需要填充你的着色器结构。
最佳答案
所以看起来这就是使用 Metal 缓冲区的 Just The Way It Is™:您必须填充着色器结构以匹配应用程序结构的步幅。我认为 Metal 着色器运行时从缓冲区加载 stride
字节并转换第一个 sizeof(MyShaderStruct) 并不困难
个。或者在附加管道状态时自动填充结构。但这些便利可能会影响效率。
这是我的 Swift/Shader 结构现在的样子以供引用:
Metal :
struct Particle
{
float3 position;
float3 prevPos;
float4 color;
float4 lineColor;
float scale;
char pad[60];
};
swift :
struct Particle {
var position = float3()
var prevPos = float3()
var color = float4()
var lineColor = float4()
var scale:Float = 0
var gravity = float3()
var data: DataRef!
weak var physics: Physics? = nil
var state = State.Free
enum State: Int {
case Free = 0
case Active
}
}
sizeof(Particle) 113
alignof(Particle) 16
strideof(Particle) 128
关于iOS Metal 缓冲区不尊重步幅值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33290986/
我不确定哪种结构布局最适合我的应用程序:共享、打包、std140、std430。我并不是要求对每个信息进行解释,这些信息很容易找到,只是很难弄清楚每个信息对供应商兼容性/性能的影响。如果 shared
如何在 Swift 中获取特定数字类型的最小值(跨度)?我的意思是,最短的非零步幅。例如 1 代表 Int,0.00...001 代表 Double 等... 最佳答案 这已经在单独的评论中得到了部分
有没有办法告诉 numpy 在写入 python pickle 文件时保留非标准步幅? >>> # Create an array with non-standard striding >>> x =
我将图像存储为 2d numpy 数组(可能是多维)。 我可以在那个反射(reflect)二维滑动窗口的数组上创建一个 View ,但是当我 reshape 它以使每一行都是一个扁平化的窗口(行是窗口
我是一名优秀的程序员,十分优秀!