- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前在 wgpu 工作为了获得超过 OpenGl 的效率优势。我以前的图形代码中的一个常见模式是使用单独的缓冲区、单独的统一数据和相同的着色器绘制许多网格。它看起来像这样(在 C++ 中):
glUseProgram(m_myProgram();
for(Mesh &mesh : m_meshes){
glBindVertexArray(mesh.vaoId());
glUniformMatrix4fv(m_transformationMatrixId, camera.getMatrix(mesh.getLocation());
glDrawElements(GL_TRIANGLES, mesh.indexCount(), GL_UINT, nullptr);
}
(可能存在一些细微且无关紧要的错误——我已经有一段时间没有使用 OpenGl 了)
然而,当我尝试使用 wgpu 在 Rust 中复制相同的模式时,我遇到了问题。
let view_projection = self.camera.build_view_projection_matrix();
let mut render_pass = encoder.begin_render_pass(&RenderPassDescriptor {
color_attachments: &[RenderPassColorAttachmentDescriptor {
attachment: &frame.view,
resolve_target: None,
load_op: LoadOp::Clear,
store_op: StoreOp::Store,
clear_color: Color {
r: 0.1,
g: 0.2,
b: 0.3,
a: 1.0,
},
}],
depth_stencil_attachment: None,
});
render_pass.set_pipeline(&self.render_pipeline);
render_pass.set_bind_group(0, &self.uniform_buffer_bind_group, &[]);
for mesh in &self.mesh{
mesh.render(&mut encoder, &mut render_pass, &view_projection, &self.uniform_buffer, &self.device); //ERROR! Can't borrow `encoder` mutably becuase `render_pass` is itself a mutable borrow, which already exists
}
渲染函数如下所示:
//build matrix
let model_matrix = Matrix4::from_translation(self.location);
let final_matrix = view_projection*model_matrix;
//send matrix to gpu
let uniforms = Uniforms::new_from_matrix(final_matrix);
let buffer = device.create_buffer_with_data(
bytemuck::cast_slice(&[uniforms]),
BufferUsage::COPY_SRC
);
command_encoder.copy_buffer_to_buffer(&buffer, 0, &uniform_buffer, 0, std::mem::size_of_val(&uniforms) as BufferAddress); //A mutable borrow to the command encoder is needed here in order to update uniforms
//setup buffers
render_pass.set_vertex_buffer(0, &self.vertex_buffer, 0, 0);
render_pass.set_index_buffer(&self.index_buffer, 0, 0);
//render
render_pass.draw(0..self.index_count, 0..1);
显然,需要可变借用来更新制服。为了提高效率,我强烈建议不要为每个网格启动新的渲染 channel 。所以,我问,如何在渲染过程中更新 wgpu 中的统一数据,以使用相同的设置渲染许多网格(除了制服)?有没有其他更好的方法来完成我想要的(使用自己的缓冲区和制服渲染许多网格,但共享着色器)?
我非常彻底地阅读了 wgpu 的 docs.rs 条目,但找不到与我想要的内容相关的任何内容。我也尝试过,但没有找到一个使用 wgpu 的严肃的 FOSS 项目,这样我就可以看到它是如何处理这个问题的。
请注意,我使用的是 wgpu 0.5.0 而不是 0.6.0,因为这就是 the best introductory documentation for wgpu that I can find用途。
最佳答案
在 render_pass 中,所有绘制调用同时执行,因此在 render_pass 中插入缓冲区更新不会产生预期的结果。
如果你想在绘制调用之前更新缓冲区,你需要创建一个新的 render_pass。
关于graphics - 我如何在 wgpu 的渲染过程中更改制服?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63663103/
我目前在 wgpu 工作为了获得超过 OpenGl 的效率优势。我以前的图形代码中的一个常见模式是使用单独的缓冲区、单独的统一数据和相同的着色器绘制许多网格。它看起来像这样(在 C++ 中): glU
我正在尝试一些 rust 代码,这些代码是对 Learn WGPU tutorial 中显示的代码的轻微重组。 ,包括添加统一变换以在固定(像素)位置和大小处绘制对象。 我注意到,当我调整窗口大小时,
使用 wgpu-rs,我试图将 3x3 cgmath 矩阵放入着色器(使用 glsl-to-spirv 编译)。但是,着色器中生成的 mat3 数据不正确。当我用 mat4 和 Matrix4 替换
我是一名优秀的程序员,十分优秀!