Open6
Terra(Rust)を読む

読む

とりあえず時間帯を変えることからはじめてみる

main.rs

ユリウス通日+0.5した
terrain.update(
&device,
&queue,
view_proj,
position.into(),
2451545.5 // UPDATED
+ epoch
+ start_time.elapsed().as_secs_f64() * opt.timescale / 86400.0,
);
日本が昼になった

lib.rs
から、空を描画するパイプラインに焦点を当ててて調べる
pub struct Terrain {
sky_shader: rshader::ShaderSet,
sky_bindgroup_pipeline: Option<(wgpu::BindGroup, wgpu::RenderPipeline)>,
...
}
rshader::Shader
はVertex/Fragment/Computeシェーダをひとまとめに扱う
pub struct ShaderSet {
inner: ShaderSetInner,
vertex_source: Option<ShaderSource>,
fragment_source: Option<ShaderSource>,
compute_source: Option<ShaderSource>,
last_update: Instant,
}
skyでは対応する頂点とフラグメントのシェーダを格納している
let sky_shader = rshader::ShaderSet::simple(
rshader::shader_source!("shaders", "sky.vert", "declarations.glsl"),
rshader::shader_source!(
"shaders",
"sky.frag",
"declarations.glsl",
"pbr.glsl",
"atmosphere.glsl",
"hash.glsl"
),
)
.unwrap();
wgsl
やglsl
が混在しているのに扱えるのはnagaの力だろうか

sky_bindgroup_pipeline
はnew()
ではなくupdate()
で具体的なパイプラインが格納される
実装を見ると
if self.sky_bindgroup_pipeline.is_none() {
let (bind_group, bind_group_layout) = self.gpu_state.bind_group_for_shader(
device,
&self.sky_shader,
HashMap::new(),
HashMap::new(),
"sky",
);
...
最初に、GPUState
のメソッドとして、bind_group_for_shader
にてbindgroupとlayoutを作成している
GPUStateとは何だろう?