/
redgpu
/
ezEngine
Обзор
Документация
Войти
/
redgpu
/
ezEngine
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
Data/Samples/ShaderExplorer/Shaders/aoTest.ezShader
160 строк
4 KB
Sanakan8472
Material Refactor [BREAKING CHANGE] (#1516)
12 апр 2025, 14:25
Не верифицирован
12 апр 2025, 14:25
b7eaf26
Код
Авторство
О чём код?
[PLATFORMS] ALL [PERMUTATIONS] [RENDERSTATE] DepthTest = false CullMode = CullMode_None [MATERIALCONSTANTS] MAT4(ViewMatrix); [VERTEXSHADER] #include "Common.h" VS_OUT main(VS_IN Input) { VS_OUT RetVal; RetVal.Position = float4(Input.Position, 1.0f); RetVal.FragCoord = Input.Position.xy * 0.5f + 0.5f; return RetVal; } [PIXELSHADER] #include "Common.h" #include <Shaders/Common/GlobalConstants.h> #define SCENE_FUNC scene #define SCENE_FUNC_RETTYPE float4 #define SCENE_INVALID_VALUE -1.0 #include "SignedDistanceUtils.h" float4 scene(float3 p) { return opUnion( opUnion( opUnion( opUnion( opUnion( float4(sdPlaneXZ(p), 0.5, 0.5, 0.5), float4(sdBox(p - float3(-0.3,0.05,0.15), float3(0.05, 0.05, 0.1)), 0.25, 0.25, 0.25) ), float4(sdBox( p - float3(0.4, 0.2, 0.0), float3(0.025, 0.4, 0.4)), 0.2, 0.6, 0.2)), float4(opSubtract(sdBox( p - float3(0.0, 0.2, -0.375), float3(0.4, 0.4, 0.025)), udRoundBox( p - float3(0.1, 0.25, -0.35), float3( 0.1, 0.1, 0.1), 0.01)), 0.2, 0.6, 0.2)), float4(udRoundBox( p - float3(0, 0.1, 0.15), float3( 0.4, 0.005, 0.15), 0.005), 0.25, 0.25, 0.25)), float4(udRoundBox( p - float3(0, 0.6, 0), float3( 0.5, 0.01, 0.5), 0.01), 0.2, 0.6, 0.2)); } float shadow(float3 p, float3 dir, float mint, float tmax) { float t = mint; float result = 0.2; for(int i=0; i < 32; i++) { float dist = scene(p + dir * t).x; result = min(max(dist-0.001,0)/t*2, result); if(dist < 0.001) break; t += max(dist, 0.001); } return saturate(result/0.2); } float directionalLight(float3 p, float3 N, float3 lightDir) { return saturate(dot(N, -lightDir)) * shadow(p, -lightDir, 0.01, 3); } float traceCone(float3 p, float3 dir, float tmin, float tmax) { float t = tmin; float result = 1.0; for(int i=0; i < 64; i++) { float dist = scene(p + dir * t).x; result = min(result, max(dist-0.005,0)/t); if(dist < 0.001 || t > tmax) break; //t += max(dist, 0.05); t += dist; } return max(result, 0); } float calcAOExpensive( float3 pos, float3 nor ) { float3 up = float3(0,1,0); if(abs(dot(up,nor)) > 0.9) { up = float3(1,0,0); if(abs(dot(up,nor)) > 0.9) up = float3(0,0,1); } float3 left = normalize(cross(nor, up)); up = normalize(cross(nor, left)); float contrib = saturate(traceCone(pos, nor, 0.01, 2.5) / 0.577); contrib += saturate(traceCone(pos, left * 0.866 + nor * 0.5, 0.01, 2.5) / 0.577); contrib += saturate(traceCone(pos, left * -0.866 + nor * 0.5, 0.01, 2.5) / 0.577); contrib += saturate(traceCone(pos, up * 0.866 + nor * 0.5, 0.01, 2.5) / 0.577); contrib += saturate(traceCone(pos, up * -0.866 + nor * 0.5, 0.01, 2.5) / 0.577); contrib /= 5.0f; return contrib; } float calcAOCheap( float3 pos, float3 nor, float stepSize ) { float occ = 0.0; float sca = 1.0; for( int i=0; i<5; i++ ) { float hr = 0.01 + stepSize*float(i); float3 aopos = nor * hr + pos; float dd = scene( aopos ).x; occ += -(dd-hr)*sca; sca *= 0.95; } return clamp( 1.0 - 3.0*occ, 0.0, 1.0 ); } float3 render( float3 ro, float3 rd ) { float4 hit = castRay(ro, rd); float3 result = float3(0.0, 0.0, 0.0); if(hit.x < 20) { float3 objColor = hit.yzw; float3 hitPos = ro + hit.x * rd; float3 N = calcNormal( hitPos ); result += directionalLight(hitPos, N, normalize(float3(0.4, -0.5, 0.4))) * objColor; result += (0.5 * calcAOCheap(hitPos, N, 0.03) + 0.01) * objColor; // ambient //result += (0.5 * calcAOExpensive(hitPos, N) + 0.01) * objColor; // ambient //result = calcAOExpensive( hitPos, N) * objColor; } return result; } float4 main(PS_IN Input) : SV_Target { float2 iResolution = float2(1280, 720); float2 q = Input.FragCoord.xy; float2 p = -1.0+2.0*q; p.x *= ViewportSize.x/ViewportSize.y; // camera-to-world transformation float3 ro = mul(GetCameraToWorldMatrix(), float4(0.0f, 0.0f, 0.0f, 1.0f)).xyz; float3 rd = mul(GetCameraToWorldMatrix(), float4(p.x, p.y, 2.0f, 0.0f)).xyz; // render float3 col = render( ro, normalize(rd) ); col = pow( max(col, float3(0,0,0)), float3(0.4545,0.4545,0.4545) ); return float4( col, 1.0 ); }