option HAS_DIFFUSE_TEXTURE: bool; option HAS_ALPHA_TEXTURE: bool; option ALPHA_TEST: bool; const HasUV = ALPHA_TEST && (HAS_DIFFUSE_TEXTURE || HAS_ALPHA_TEXTURE); [layout(std140)] struct BasicSettings { AlphaThreshold: f32, DiffuseColor: vec4 } [layout(std140)] struct InstanceData { worldMatrix: mat4, invWorldMatrix: mat4 } [layout(std140)] struct ViewerData { projectionMatrix: mat4, invProjectionMatrix: mat4, viewMatrix: mat4, invViewMatrix: mat4, viewProjMatrix: mat4, invViewProjMatrix: mat4, renderTargetSize: vec2, invRenderTargetSize: vec2, eyePosition: vec3 } external { [set(0), binding(0)] viewerData: uniform, [set(1), binding(0)] instanceData: uniform, [set(2), binding(0)] settings: uniform, [set(2), binding(2)] MaterialAlphaMap: sampler2D, } // Fragment stage struct FragIn { [location(0), cond(HasUV)] uv: vec2 } [entry(frag), cond(ALPHA_TEST)] fn main(input: FragIn) { let alpha = settings.DiffuseColor.a; const if (HAS_DIFFUSE_TEXTURE) // TODO: alpha *= MaterialDiffuseMap.Sample(input.uv).a; alpha = alpha * MaterialDiffuseMap.Sample(input.uv).a; const if (HAS_ALPHA_TEXTURE) // TODO: alpha *= MaterialAlphaMap.Sample(input.uv).x alpha = alpha * MaterialAlphaMap.Sample(input.uv).x; // TODO: const assert? if (alpha < settings.AlphaThreshold) discard; } [entry(frag), cond(!ALPHA_TEST)] fn main() {} // Vertex stage struct VertIn { [location(0)] pos: vec3, [location(1), cond(HasUV)] uv: vec2 } struct VertOut { [location(0), cond(HasUV)] uv: vec2, [builtin(position)] position: vec4 } [entry(vert)] fn main(input: VertIn) -> VertOut { let output: VertOut; output.position = viewerData.viewProjMatrix * instanceData.worldMatrix * vec4(input.pos, 1.0); const if (HasUV) output.uv = input.uv; return output; }