- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在将一个结构数组传递给我的 Metal 着色器顶点函数。该结构如下所示:
struct Vertex {
var x,y,z: Float // position data
var r,g,b,a: Float // color data
var s,t: Float // texture coordinates
var nX,nY,nZ: Float // normal
func floatBuffer() -> [Float] {
return [x,y,z,r,g,b,a,s,t,nX,nY,nZ]
}
};
floatBuffer 函数用于将顶点组装成一个大的 Floats 数组。我可以通过使用使用“打包”数据类型的结构定义将它传递到我的着色器函数中,如下所示:
struct VertexIn {
packed_float3 position;
packed_float4 color;
packed_float2 texCoord;
packed_float3 normal;
};
vertex VertexOut basic_vertex(
const device VertexIn* vertex_array [[ buffer(0) ]],
.
.
.
这行得通。但是,我想知道如何使用 MTLVertexAttributeDescriptors 和相关语法来做同样的事情。现在我得到了损坏的多边形,大概是因为 float3 和 packed_float3 的字节对齐差异?
这就是我现在尝试定义它并获取垃圾多边形的方式。我收到“packed_float3”对属性无效的错误,所以我想弄清楚如何使常规 float3、float4 等工作。
struct VertexIn {
float3 position [[attribute(RayVertexAttributePosition)]];
float4 color [[attribute(RayVertexAttributeColor)]];
float2 texCoord [[attribute(RayVertexAttributeTexCoord)]];
float3 normal [[attribute(RayVertexAttributeNormal)]];
};
class func buildMetalVertexDescriptor() -> MTLVertexDescriptor {
let mtlVertexDescriptor = MTLVertexDescriptor()
var offset = 0
mtlVertexDescriptor.attributes[RayVertexAttribute.position.rawValue].format = MTLVertexFormat.float3
mtlVertexDescriptor.attributes[RayVertexAttribute.position.rawValue].offset = offset
mtlVertexDescriptor.attributes[RayVertexAttribute.position.rawValue].bufferIndex = RayBufferIndex.positions.rawValue
offset += 3*MemoryLayout<Float>.stride
mtlVertexDescriptor.attributes[RayVertexAttribute.color.rawValue].format = MTLVertexFormat.float4
mtlVertexDescriptor.attributes[RayVertexAttribute.color.rawValue].offset = offset
mtlVertexDescriptor.attributes[RayVertexAttribute.color.rawValue].bufferIndex = RayBufferIndex.positions.rawValue
offset += MemoryLayout<float4>.stride
mtlVertexDescriptor.attributes[RayVertexAttribute.texCoord.rawValue].format = MTLVertexFormat.float2
mtlVertexDescriptor.attributes[RayVertexAttribute.texCoord.rawValue].offset = offset
mtlVertexDescriptor.attributes[RayVertexAttribute.texCoord.rawValue].bufferIndex = RayBufferIndex.positions.rawValue
offset += MemoryLayout<float2>.stride
mtlVertexDescriptor.attributes[RayVertexAttribute.normal.rawValue].format = MTLVertexFormat.float3
mtlVertexDescriptor.attributes[RayVertexAttribute.normal.rawValue].offset = offset
mtlVertexDescriptor.attributes[RayVertexAttribute.normal.rawValue].bufferIndex = RayBufferIndex.positions.rawValue
offset += 3*MemoryLayout<Float>.stride
print("stride \(offset)")
mtlVertexDescriptor.layouts[RayBufferIndex.positions.rawValue].stride = offset
mtlVertexDescriptor.layouts[RayBufferIndex.positions.rawValue].stepRate = 1
mtlVertexDescriptor.layouts[RayBufferIndex.positions.rawValue].stepFunction = MTLVertexStepFunction.perVertex
return mtlVertexDescriptor
}
请注意,我将第一个属性指定为 float3,但我指定了 3 个 float 的偏移量,而不是 float3 通常使用的 4 个 float 。但显然这还不够。我想知道如何设置 MTLVertexDescriptor 和带有属性的着色器结构,以便它处理来 self 的结构的“打包”数据?
非常感谢。
最佳答案
关键在于您问题的这一部分:“请注意,我将第一个属性指定为 float3,但我指定了 3 个 float 的偏移量,而不是 float3 通常使用的 4 个 float ”。
SIMD float3 类型占用 16 个字节,它与非打包的 Metal float3 类型具有相同的内存布局。因此,当您将偏移量设置为仅 3*MemoryLayout.stride 时,您会丢失仍然存在的最后 4 个字节,从而导致下一个字段从这些额外字节中提取并偏移其余数据。
要真正使用打包类型将数据传输到 Metal(或任何图形 API),您要么必须坚持之前所做的并在数组中的三个单独的 Floats 中指定 x、y、z,要么必须定义你自己的结构是这样的:
struct Vector3 {
var x: Float
var y: Float
var z: Float
}
Swift 不保证这个结构将是三个 Float 紧密打包在一起,但在现在和可预见的 future 它可以工作,并且在大多数平台上大小为 12 字节。
如果您希望能够对这样的结构进行向量运算,那么我建议您寻找一个定义此类类型的库,以节省您一些时间,因为您也会遇到与 3x3 矩阵相同类型的问题.
我遇到了同样的问题,所以我最终推出了自己的: https://github.com/jkolb/Swiftish
关于metal - 如何在 Metal 顶点着色器 MTL 顶点属性描述符中描述 packed_float3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47061717/
我试图通过基于现有设计实现我自己的小型库来理解 monad 转换器。 我坚持的是语言扩展。在 MonadError ,唯一提到的扩展名是 UndecidableInstances .但是,如果不使用
我正在尝试使用 Hlist 在 cats mtl 中创建可组合状态类型,并定义了 MonadState 如下 implicit def hlistStateMonad[M[_], S A):M[A]
请给我一些使用 MTL 2 进行矩阵乘法的提示。或任何引用。或 MTL 2 文档的链接。 最佳答案 我们不应该只发布链接,但是给你。在该页面的侧边栏中可以选择文档。 http://www.osl.iu
我正在使用 ModelI/O 来展示 3D 模型。这是我的代码: // Load the .OBJ file guard let url = Bundle.main.url(forResour
我的 .obj 文件旁边有一个 .mtl 文件,它指定了对象的 Material 。我试图创建一个解析器,但不知道“Ke”属性是什么意思。 例如: Ka 0.78 0.78 0.78 Kd 0.78
我正在尝试使用 lwjgl 在 Java 中加载 .obj 文件,而不使用任何库来执行此操作。我创建了一个类来加载没有 Material 和纹理的模型。这很容易。但现在我想为模型添加 Material
我已经从 turbosquid 下载了一个免费模型.它包含一个 obj 和 mtl,以及纹理(高光、凹凸贴图等)。现在我只对 mtl 和 obj 文件感兴趣。所以我下载了一个免费模型from here
快速提问,如何将 .obj 模型加载到 directx 11 (d3d11.h) 以及 Material 的 .mtl 文件中。提前致谢。 最佳答案 您可以编写自己的解析器,obj 是一种非常简单的文
程序如下: #include #include using namespace mtl; int main(int argc, char* argv[]) { dense_vector a(5,1
我目前正在解析与我拥有的 .obj 文件关联的 .mtl 文件。我可以正确渲染模型,但如何使用 .mtl 文件?我应该将它的值发送到哪里?我该如何使用它?目前,在 OpenGL 中找不到任何使用 .m
我是 three.js 的新手,我遇到了这个问题。我对我的脸进行了 3D 扫描,结果只给我 .obj 文件。如果我在 Meshlab 模型上打开该文件,它就会带有颜色。但在我将它加载到 three.j
在加载 MTL 文件时,整个模型都变黑了。我已经引用了这个链接并将 rbg 参数设置为 1 但这并没有解决我的问题。 three.js mtl loader renders black 这是与之相关的
查看 Control.Applicative 的文档,我注意到它们有某些 monad 的实例声明(例如 IO , Maybe 和特别是 ST ),但是没有 MTL monad 的实例,例如 State
正如问题所述,我有一个 obj 文件和一个包含纹理详细信息的 mtl 文件,我想在 mtl 文件上上传一个带有纹理的 obj 文件Forge Viewer,以便它可以显示带有纹理的模型。 我找到了一个
我见过this这篇文章对自由单子(monad)进行了抽象的描述。我也了解 Monad Transformer 是什么,并且我(在某种程度上)了解它们为何有用。 我不知道免费 monad 的用途是什么,
我正在设计一个小游戏,它基本上使用 StateT 并且只是更新状态。以下是简化版本: {-# LANGUAGE TemplateHaskell #-} import Control
我正在按照提出的想法使用 monad-transformers 编写一个小型 DSL这里here .为了illustration 我在这里展示了一小部分。 class Monad m => Proje
因此,即使在示例“webgl_loader_obj_mtl”中,也没有使用环境光。你可以把它注释掉,这没有什么区别。它依赖于定向光。如果注释掉方向,则不会显示任何内容(因为环境不转换颜色)。 有办法解
我一直在尝试使用 ASSIMP 加载 Wavefront obj 模型。但是,我无法让 mtl Material 颜色正常工作 (Kd rgb)。我知道如何加载,但是,我不知道如何为每个顶点获取相应的
我想知道是否有可能确定给定类型是否是原子的(这意味着您可以在没有互斥量的情况下对其执行操作,而不会使自己处于危险之中)。 我想知道是否有一些 atomic(type) 定义可以确定类型是否是原子的。为
我是一名优秀的程序员,十分优秀!