首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Mesh.SetVertices()转换为Mesh.SetVertexBufferParams()和Mesh.SetVertexBufferData()

将Mesh.SetVertices()转换为Mesh.SetVertexBufferParams()和Mesh.SetVertexBufferData()
EN

Stack Overflow用户
提问于 2022-08-24 01:47:30
回答 1查看 105关注 0票数 1

我试图提高一些网格生成的性能,所以我想从使用SetVertices()改为SetVertexBufferParam/Data模式。这就是我所拥有的:

代码语言:javascript
复制
// verts is a NativeArray<float3>
// numVerts is the length of verts
Mesh mesh = new Mesh();

// this works and creates a series of flat faces
mesh.SetVertices(verts);

// this creates a mesh but it's very wrong
mesh.SetVertexBufferParams(numVerts,
  new VertexAttributeDescriptor(VertexAttribute.Position, VertexAttributeFormat.Float32, 3),
  new VertexAttributeDescriptor(VertexAttribute.Normal, VertexAttributeFormat.Float32, 3));
mesh.SetVertexBufferData(verts, 0, 0, numVerts);

// afterwards I set indices, norms, etc.

使用SetVertexBufferData所期望的结果与结果:

我做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-24 07:23:24

参见Mesh.SetVertexBufferData,特别是VertexAttributeDescriptor

通常你使用你自己的顶点结构。你正在传递一个布局

代码语言:javascript
复制
new VertexAttributeDescriptor(VertexAttribute.Position, VertexAttributeFormat.Float32, 3),
new VertexAttributeDescriptor(VertexAttribute.Normal, VertexAttributeFormat.Float32, 3)

它需要一个由6×Float32组成的输入结构,例如。

代码语言:javascript
复制
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct YourVertex
{
    public Vector3 position;
    public Vector3 normal;
}

但实际上,您只提供了float3数据,这些数据仅足以

代码语言:javascript
复制
new VertexAttributeDescriptor(VertexAttribute.Position, VertexAttributeFormat.Float32, 3)

在本机数组中,您基本上只需要获得

代码语言:javascript
复制
float, float, float, float, float, float, float, float, float, float, ...

这是布局的工作,确定如何准确地解释这些内容。因此,由于您告诉布局需要一个3x Float32位置+3x Float32法线,所以它试图始终将3个浮点数应用到该位置,并将3个浮点数应用到正常位置。

=>实际上属于下一个顶点的这3种浮标在正常情况下有点“丢失”/应用不当

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73466626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档