yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
1fb79ac4f
master
1// raster-simple.slang 2 3struct AssembledVertex 4{ 5 float3 position : POSITION; 6 float3 normal : NORMAL; 7 float2 uv : TEXCOORD; 8}; 9 10struct RasterVertex 11{ 12 float3 worldPosition; 13 float3 worldNormal; 14 float2 uv; 15}; 16 17struct Model 18{ 19 float3x4 modelToWorld; 20 float3x4 modelToWorld_inverseTranspose; 21} 22 23struct Material 24{ 25 Texture2D<float3> albedoMap; 26 Texture2D<float3> normalMap; 27 Texture2D<float> glossMap; 28 SamplerState sampler; 29 float2 uvScale; 30 float2 uvBias; 31} 32 33struct Camera 34{ 35 float3x4 worldToView; 36 float3x4 worldToView_inverseTranspose; 37 38 float4x4 viewToProj; 39} 40 41struct DirectionalLight 42{ 43 float3 intensity; 44 float3 direction; 45} 46 47struct Environment 48{ 49 TextureCube environmentMap; 50 DirectionalLight light; 51} 52 53uniform Model model; 54uniform ParameterBlock<Material> material; 55uniform ConstantBuffer<Camera> camera; 56uniform ParameterBlock<Environment> environment; 57 58[shader("vertex")] 59[require(sm_6_0)] 60void vertexMain( 61 in AssembledVertex assembledVertex : A, 62 out RasterVertex rasterVertex : R, 63 in uint vertexID : SV_VertexID, 64 out float4 projPosition : SV_Position) 65{ 66 float3 worldPosition = mul(model.modelToWorld, float4(assembledVertex.position,1)); 67 68 rasterVertex.worldPosition = worldPosition; 69 rasterVertex.worldNormal = mul(model.modelToWorld_inverseTranspose, float4(assembledVertex.normal,0)); 70 rasterVertex.uv = assembledVertex.uv; 71 72 float3 viewPosition = mul(camera.worldToView, float4(worldPosition,1)); 73 projPosition = mul(camera.viewToProj, float4(viewPosition,1)); 74} 75 76[shader("fragment")] 77[require(sm_6_0)] 78float4 fragmentMain( 79 in RasterVertex vertex : R) 80 : SV_Target0 81{ 82 float3 normal = vertex.worldNormal; 83 84 float3 albedo = material.albedoMap.Sample(material.sampler, vertex.uv); 85 86 float3 color = albedo * max(0, dot(normal, environment.light.direction)); 87 return float4(color, 1); 88}