首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在绘制2D点时消除顶点缓冲区中的字节重复

在绘制2D点时消除顶点缓冲区中的字节重复
EN

Stack Overflow用户
提问于 2022-06-23 18:04:22
回答 1查看 62关注 0票数 0

我正在使用wgpu-rs

我在画一个在三角形内的2D点。我希望这一点有一个单一的颜色贯穿。

我目前的实现是重复一些字节,似乎是浪费。我想一定有更好的办法。

对于每个(x,y)对,它还包括颜色的Vec3<f32>,如(r,g,b)、中心的Vec2<f32>和半径的f32值。我的问题是,当我只需要它一次的时候,这三个顶点中的每一个都会重复这个数据。

我编写了一个类似于这样的结构来保存数据:

代码语言:javascript
复制
pub struct Point {
    pub position: [f32; 2],
    pub color: [f32; 3],
    pub center: [f32; 2],
    pub radius: f32,
}

构建wgpu::VertexAttribute的内存布局如下所示:

代码语言:javascript
复制
        &[
            (mem::size_of::<[f32; 2]>(), wgpu::VertexFormat::Float32x2), 
            (mem::size_of::<[f32; 3]>(), wgpu::VertexFormat::Float32x3), 
            (mem::size_of::<[f32; 2]>(), wgpu::VertexFormat::Float32x2), 
            (mem::size_of::<[f32; 1]>(), wgpu::VertexFormat::Float32), 
        ]

(这段代码本来是不完整的,只是为了澄清我的问题。)

我的问题是:

当我传递相同的半径、相同的中心和每个顶点的相同颜色时,是否有方法将数据捆绑到顶点缓冲区,这样每个顶点就不会重复这些信息?我不能在这里使用uniform (我认为),因为我可能同时绘制不同半径和颜色的许多点,因此这些变量是不同的。对于每一点,半径,中心和颜色数据被重复3次,当我只需要它一次。

我不知道如何做到这一点,因为我需要颜色,中心和半径的信息,每个顶点内的着色模块。

例如,我不确定是否可以将数据分离成不同的结构,或者使用2个缓冲区或其他什么东西。似乎必须有某种方法来减少这些多余字节的使用,因为如果绘制了许多点,这将是相当浪费的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-23 23:11:30

您可以使用索引缓冲区来重复顶点。索引缓冲区应将16位或32位索引数组包含到顶点缓冲区中,并使用set_index_buffer()指定。当您使用draw_indexed()而不是draw()时,GPU迭代索引缓冲区而不是顶点缓冲区,并使用索引缓冲区中的每个索引从顶点缓冲区查找顶点数据。

索引缓冲区通常用于复杂网格中的每个顶点可由多个三角形共享,但它们也适用于您的情况;索引缓冲区将包含

代码语言:javascript
复制
[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, ...]

您的代码中没有其他部分需要更改来使用索引缓冲区;您只需要创建它,set_index_buffer()它,并调用draw_indexed()而不是draw()

还可以完全删除索引缓冲区,并使用顶点着色代码进行顶点查找,但这需要不同的使用顶点缓冲区,而且我本人还没有使用过这种技术。

我认为你可能已经这样做了,但万一你没有:一个三角形,其顶点都有相同的位置作为输出的顶点着色器将折叠为没有像素。为了使用3个相同的顶点来绘制任何东西,您需要让顶点着色器偏移三角形每个角的位置,使用vertex_index 内建价值模3来识别它正在处理的三角形的哪个角。

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

https://stackoverflow.com/questions/72734702

复制
相关文章

相似问题

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