/
redgpu
/
ezEngine
Обзор
Документация
Войти
/
redgpu
/
ezEngine
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
Data/Base/Shaders/Materials/SpriteMaterial.ezShader
221 строка
5 KB
C-Core
Made occluded shape icon fade distance configurable (#1937)
11 май 2026, 15:02
Не верифицирован
11 май 2026, 15:02
8297894
Код
Авторство
О чём код?
[PLATFORMS] ALL [PERMUTATIONS] SHAPE_ICON BLEND_MODE RENDER_PASS MSAA TWO_SIDED = FALSE FLIP_WINDING = FALSE CAMERA_MODE SHADING_MODE = SHADING_MODE_FULLBRIGHT PREPARE_DEPTH [RENDERSTATE] #include <Shaders/Materials/MaterialState.h> WireFrame = false #if SHAPE_ICON && PREPARE_DEPTH DepthTest = false DepthWrite = false #endif [SHADER] #define USE_TEXCOORD0 #define USE_COLOR0 #if (RENDER_PASS == RENDER_PASS_EDITOR) || (RENDER_PASS == RENDER_PASS_PICKING) || (RENDER_PASS == RENDER_PASS_PICKING_WIREFRAME) #define USE_GAME_OBJECT_ID #endif #if defined(USE_GAME_OBJECT_ID) #define GAME_OBJECT_ID_INTERPOLATOR uint GameObjectID : GAME_OBJECT_ID; #else #define GAME_OBJECT_ID_INTERPOLATOR #endif #if SHAPE_ICON #define SHAPE_ICON_INTERPOLATOR float ShapeIconFadeOut : SHAPE_ICON_FADE_OUT; #else #define SHAPE_ICON_INTERPOLATOR #endif #if defined(USE_GAME_OBJECT_ID) || SHAPE_ICON #define CUSTOM_INTERPOLATOR GAME_OBJECT_ID_INTERPOLATOR SHAPE_ICON_INTERPOLATOR #endif [VERTEXSHADER] #include <Shaders/Common/GlobalConstants.h> #include <Shaders/Materials/MaterialInterpolator.h> #include <Shaders/Materials/SpriteData.h> StructuredBuffer<ezPerSpriteData> spriteData BIND_GROUP(BG_DRAW_CALL); VS_OUT main(uint VertexID : SV_VertexID, uint InstanceID : SV_InstanceID) { #if CAMERA_MODE == CAMERA_MODE_STEREO s_ActiveCameraEyeIndex = InstanceID % 2; #endif float2 vertexPositions[6] = { float2(0.0, 0.0), float2(0.0, 1.0), float2(1.0, 1.0), float2(0.0, 0.0), float2(1.0, 1.0), float2(1.0, 0.0), }; VS_OUT Output; #if CAMERA_MODE == CAMERA_MODE_STEREO Output.RenderTargetArrayIndex = InstanceID; #endif uint index = VertexID / 6; uint vertexIndex = VertexID % 6; float2 texCoords = vertexPositions[vertexIndex]; float2 vertexPosition = (texCoords - 0.5); texCoords.y = 1.0 - texCoords.y; ezPerSpriteData data = spriteData[index]; float3 worldPosition = data.WorldSpacePosition; float4 screenPosition = mul(GetWorldToScreenMatrix(), float4(worldPosition, 1.0)); float distance = screenPosition.w; float2 scale = mul(GetCameraToScreenMatrix(), float4(1, 1, 1, 1)).xy; scale *= data.Size; if (data.MaxScreenSize > 0.0) { float2 maxScreenSize = (data.MaxScreenSize * distance * 2.0) * ViewportSize.zw; scale = min(scale, maxScreenSize); } scale.x *= data.AspectRatio; screenPosition.xy += vertexPosition * scale; float2 texCoordScale = RG16FToFloat2(data.TexCoordScale); float2 texCoordOffset = RG16FToFloat2(data.TexCoordOffset); Output.Position = screenPosition; Output.TexCoord0 = texCoords * texCoordScale + texCoordOffset; Output.Color0 = RGBA16FToFloat4(data.ColorRG, data.ColorBA); #if PREPARE_DEPTH && SHAPE_ICON Output.Color0 = float4(0.12, 0.12, 0.15, 0); #endif #if defined(USE_GAME_OBJECT_ID) Output.GameObjectID = data.GameObjectID; #endif #if SHAPE_ICON float distanceToCamera = length(worldPosition - GetCameraPosition()); const float fadeStart = data.ShapeIconFadeDistance; const float invFadeRange = 10.0 / data.ShapeIconFadeDistance; Output.ShapeIconFadeOut = saturate(1.0 - (distanceToCamera - fadeStart) * invFadeRange); #endif return Output; } [PIXELSHADER] #if BLEND_MODE == BLEND_MODE_MASKED && MSAA #define WRITE_COVERAGE #endif #include <Shaders/Materials/MaterialHelper.h> struct PS_OUT { #if RENDER_PASS != RENDER_PASS_DEPTH_ONLY float4 Color : SV_Target; #endif #if defined(WRITE_COVERAGE) uint Coverage : SV_Coverage; #endif }; Texture2D SpriteTexture BIND_GROUP(BG_DRAW_CALL); SamplerState SpriteTexture_AutoSampler BIND_GROUP(BG_DRAW_CALL); float GetOpacity() { float opacity = SpriteTexture.Sample(SpriteTexture_AutoSampler, G.Input.TexCoord0.xy).a; #if BLEND_MODE == BLEND_MODE_MASKED return opacity - 0.5; #else return opacity; #endif } PS_OUT main(PS_IN Input) { #if CAMERA_MODE == CAMERA_MODE_STEREO s_ActiveCameraEyeIndex = Input.RenderTargetArrayIndex; #endif G.Input = Input; uint coverage = CalculateCoverage(); if (coverage == 0) { discard; } #if SHAPE_ICON && PREPARE_DEPTH // fade out after some distance if (InterleavedGradientNoise(Input.Position.xy) > Input.ShapeIconFadeOut) { discard; } #endif float4 color = SpriteTexture.Sample(SpriteTexture_AutoSampler, Input.TexCoord0.xy); #if SHAPE_ICON float3 tintedColor = saturate(color.rgb * Input.Color0.rgb * 2.0); float factor = saturate(GetLuminance(color.rgb * Input.Color0.a) * 3.0 - 2.0); color.rgb = lerp(tintedColor, 1.0, factor); #else color.rgb *= Input.Color0.rgb; #endif PS_OUT Output; #if (RENDER_PASS == RENDER_PASS_PICKING) || (RENDER_PASS == RENDER_PASS_PICKING_WIREFRAME) Output.Color = RGBA8ToFloat4(Input.GameObjectID); #elif RENDER_PASS == RENDER_PASS_EDITOR if (RenderPass == EDITOR_RENDER_PASS_STATIC_VS_DYNAMIC) { Output.Color = ColorizeGameObjectId(Input.GameObjectID); } else { Output.Color = color; } #elif RENDER_PASS != RENDER_PASS_DEPTH_ONLY Output.Color = color; #endif #if defined(WRITE_COVERAGE) Output.Coverage = coverage; #endif #if RENDER_PASS != RENDER_PASS_DEPTH_ONLY && BLEND_MODE == BLEND_MODE_MASKED Output.Color.a = 1.0f; #endif return Output; }