☰
着色器加载
CRYENGINE 社区版 1.0 引入了直接向引擎加载自定义全屏 .hlsl 着色器的支持。一个典型例子是内置的漫画着色器,展示了如何利用这一功能实现独特的视觉风格。目前,该引擎一次支持一个着色器文件,这使得该功能非常适合旨在打造独特风格化外观的项目。
用例示例——漫画中类似《行尸走肉》的视觉效果:

着色器放置
引擎只支持从项目的资产文件夹加载着色器。要使用自定义的.hlsl着色器,将文件放在这个文件夹里。为了组织清晰,我们创建了一个专门的子文件夹,名为“着色器”。
着色器放置示例路径:

着色者骨骼
下面是一个着色器骨架,你可以作为创建自己.hlsl着色器文件的起点。维护这种结构至关重要,因为编译器依赖它来正确识别和编译着色器。
//@entry ExecutePS
// Feature toggles
#define ENABLE_OUTLINES 1
#define ENABLE_POSTERIZE 1
#define ENABLE_HATCHING 1
#define ENABLE_GI_AWARE 0
// Global style scaler
#ifndef STYLE_BOOST
#define STYLE_BOOST 0.75
#endif
// Optional reversed depth
// #define REVERSED_DEPTH 1
cbuffer StyleCB : register(b0)
{
float4 P0; // x=EdgeDepthScale, y=EdgeLumaScale, z=EdgeThreshold, w=PosterizeLevels
float4 P1; // x=Unused, y=OutlineStrength, z=OutlineWidthPx, w=ColorSaturation
float4 P2; // x=ScreenWidth, y=ScreenHeight, z=TintStrength, w=StyleBlend
float4 Tint; // xyz=tint color, w=StrokeIntensity
}
// Resources
Texture2D SceneColor : register(t0);
Texture2D SceneDepth : register(t1);
SamplerState LinearClamp : register(s0);
SamplerState PointClamp : register(s1);
struct VSOut { float4 pos : SV_Position; float2 uv : TEXCOORD0; };
// ---- Utility (luma/saturation/posterize/noise/depth) ----
// Implement: Luma, AdjustSaturation, PosterizeRGB, PosterizeLuma, Hash12, FetchDepth
// ---- Sky/sun masks ----
// Implement: PureSkyMaskFromDepth, ComputeSkySunMask
// ---- Hatching ----
// Implement: LinePattern, RotHatch, HatchFactor
// ---- Edges ----
// Implement: EdgeFactor (combine luma + depth edges, optional dilation)
// ---- Grading/tint ----
// Implement: WarmCoolGradeSoft, ApplyTint
float4 ExecutePS(VSOut IN) : SV_Target
{
float3 original = SceneColor.SampleLevel(LinearClamp, IN.uv, 0).rgb;
float depth = FetchDepth(IN.uv);
float skyMask = PureSkyMaskFromDepth(depth);
float skySun = ComputeSkySunMask(IN.uv, original);
// Base styling
float styleBlend = P2.w;
float targetSat = lerp(1.0, P1.w, styleBlend);
float3 styled = AdjustSaturation(original, targetSat);
styled = WarmCoolGradeSoft(styled);
styled = ApplyTint(styled);
// Posterization
#if ENABLE_POSTERIZE
float levels = max(2.0, P0.w);
float3 pre = styled;
// Optional: add dither noise for sky areas
float3 post = PosterizeLuma(PosterizeRGB(pre, levels), levels * 0.6);
float posterBlend = saturate(styleBlend * 1.0 * STYLE_BOOST);
styled = lerp(styled, post, posterBlend * (1.0 - skyMask));
#endif
// Hatching
#if ENABLE_HATCHING
float shade = dot(styled, float3(0.299,0.587,0.114));
float hatch = HatchFactor(IN.uv, shade);
float hatchBlend = saturate(styleBlend * 1.0 * STYLE_BOOST);
styled = lerp(styled, styled * hatch, hatchBlend * (1.0 - skyMask));
#endif
// Outlines
float edge = 0.0;
#if ENABLE_OUTLINES
edge = EdgeFactor(IN.uv);
float outlineAlpha = edge * P1.y * 1.0 * STYLE_BOOST;
float3 ink = float3(0.04, 0.04, 0.045);
float3 base = styled;
float3 composed = base * (1.0 - outlineAlpha) + ink * outlineAlpha;
#else
float3 composed = styled;
#endif
// Restore sky if desired
composed = lerp(composed, original, skyMask);
return float4(saturate(composed), 1.0);
}
着色器加载
- 通过工具→环境编辑器打开环境编辑器。
- 创建一个新环境预设或选择已有的环境。
- 在常数部分,导航到着色器加载。
- 通过勾选启用着色器加载来启用着色器加载。
- 加载你想要的着色器文件。
启用后,每次使用该环境预设时,着色器都会自动应用。
环境编辑器中的着色器加载:

