rendiation icon indicating copy to clipboard operation
rendiation copied to clipboard

Implement dependency collecting in fragment in and vertex out

Open mikialex opened this issue 1 year ago • 1 comments

Should we allow every semantic shader value in the vertex stage to has auto injected vertex out?

impl ShaderGraphProvider for PhysicalMaterialGPU {
  fn build(
    &self,
    builder: &mut ShaderGraphRenderPipelineBuilder,
  ) -> Result<(), ShaderGraphBuildError> {
    // i don't think it's the good place for this logic, but where? <- fix this issue
    builder.vertex(|builder, _| {
      let uv = builder.query::<GeometryUV>()?.get();
      builder.set_vertex_out::<FragmentUv>(uv);
      Ok(())
    })?;

    builder.fragment(|builder, binding| {
      let uniform = binding.uniform_by(&self.uniform, SB::Material).expand();
      let sampler = binding.uniform_by(&self.sampler, SB::Material);
      let albedo_tex = binding.uniform_by(&self.texture, SB::Material);

      let uv = builder.query::<FragmentUv>()?.get();
      let albedo = albedo_tex.sample(sampler, uv).xyz() * uniform.albedo;

      builder.set_fragment_out(0, (albedo, 1.))
    })
  }
}

mikialex avatar Aug 30 '22 17:08 mikialex

update: we impled interpolate api now:

impl ShaderGraphProvider for PhysicalMaterialGPU {
  fn build(
    &self,
    builder: &mut ShaderGraphRenderPipelineBuilder,
  ) -> Result<(), ShaderGraphBuildError> {
    builder.fragment(|builder, binding| {
      let uniform = binding.uniform_by(&self.uniform, SB::Material).expand();
      let sampler = binding.uniform_by(&self.sampler, SB::Material);
      let albedo_tex = binding.uniform_by(&self.texture, SB::Material);

      let uv = builder.query_or_interpolate_by::<FragmentUv, GeometryUV>();
      let albedo = albedo_tex.sample(sampler, uv).xyz() * uniform.albedo;

      builder.set_fragment_out(0, (albedo, 1.))
    })
  }
}

but still useful, if we could tree shake our dependency

mikialex avatar Aug 31 '22 17:08 mikialex