Open6

Terra(Rust)を読む

ぺるきぺるき

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

ぺるきぺるき

ユリウス通日+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();

wgslglslが混在しているのに扱えるのはnagaの力だろうか

ぺるきぺるき

sky_bindgroup_pipelinenew()ではなく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とは何だろう?