我正在使用wgpu-rs。
我在画一个在三角形内的2D点。我希望这一点有一个单一的颜色贯穿。
我目前的实现是重复一些字节,似乎是浪费。我想一定有更好的办法。
对于每个(x,y)对,它还包括颜色的Vec3<f32>,如(r,g,b)、中心的Vec2<f32>和半径的f32值。我的问题是,当我只需要它一次的时候,这三个顶点中的每一个都会重复这个数据。
我编写了一个类似于这样的结构来保存数据:
pub struct Point {
pub position: [f32; 2],
pub color: [f32; 3],
pub center: [f32; 2],
pub radius: f32,
}构建wgpu::VertexAttribute的内存布局如下所示:
&[
(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个缓冲区或其他什么东西。似乎必须有某种方法来减少这些多余字节的使用,因为如果绘制了许多点,这将是相当浪费的。
发布于 2022-06-23 23:11:30
您可以使用索引缓冲区来重复顶点。索引缓冲区应将16位或32位索引数组包含到顶点缓冲区中,并使用set_index_buffer()指定。当您使用draw_indexed()而不是draw()时,GPU迭代索引缓冲区而不是顶点缓冲区,并使用索引缓冲区中的每个索引从顶点缓冲区查找顶点数据。
索引缓冲区通常用于复杂网格中的每个顶点可由多个三角形共享,但它们也适用于您的情况;索引缓冲区将包含
[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, ...]您的代码中没有其他部分需要更改来使用索引缓冲区;您只需要创建它,set_index_buffer()它,并调用draw_indexed()而不是draw()。
还可以完全删除索引缓冲区,并使用顶点着色代码进行顶点查找,但这需要不同的使用顶点缓冲区,而且我本人还没有使用过这种技术。
我认为你可能已经这样做了,但万一你没有:一个三角形,其顶点都有相同的位置作为输出的顶点着色器将折叠为没有像素。为了使用3个相同的顶点来绘制任何东西,您需要让顶点着色器偏移三角形每个角的位置,使用vertex_index 内建价值模3来识别它正在处理的三角形的哪个角。
https://stackoverflow.com/questions/72734702
复制相似问题