render_stencil
StencilMap
Ziel des Stencil-Buffers für einen View. Ist diesem Pointer eine Bitmap zugewiesen,
wird der Inhalt des Stencil-Buffers nach dem Rendern in diese Bitmap kopiert
und nicht über den Bildschirm gezeichnet. Auf diese Weise lassen sich solche
Postprocessing-Effekte wie verschwommene Stencil-Schatten auf
den Stencil-Buffer anwenden. Die Stencil-Zieltextur steht Shadern durch die
Variable StencilMap zur verfügung.
Typ:
BMAP* (lite-c)
texture (shader code)
Bemerkungen:
- Die render_stencil zugewiesenen Bitmap muß von mindestens
derselben Größe sein wie der Screen-Buffer, d. h. screen_size.x und screen_size.y.
Achten Sie beim Ändern der Videoauflösung darauf, daß die render_stencil-Bitmap
nicht kleiner als der Screen-Buffer ist. Weisen Sie eine Bitmap zu, die auch
für die maximale Auflösung groß genug ist.
- Durch Zuweisen Einer Bitmap zu render_stencil wird der
Inhalt des Stencil-Buffers in die Bitmap gezeichnet, egal ob Stencil-Schatten
verwendet werden oder nicht. Dies wirkt sich auf die Framerate aus, setzen
Sie diesen Pointer also nicht unnötigerweise.
- Für einen einen Shader, der den Screen-Buffer mit einem Stencil-Buffer überblendet, setzen Sie den View-Flag von PROCESS_SCREEN. Verwendet der View ein Renderziel oder eine Postprocessing-Stufe, kann der Shader den Screen-Buffer nicht mit dem Stencil-Buffer überblenden (da es gar keinen gibt). Stattdessen muß der Shader den render_stencil über das render_target des vorigen Views blenden. Das ist etwas kostspieliger, denn es werden zwei Sampler benötigt.
- Ist mtl_shadow ein Shader zugewiesen, wird die render_stencil-Bitmap automatisch generiert und übernimmt auch automatisch die Bildschirmgröße. (ganz wie render_target). Anders als bei PROCESS_SCREEN wird der Stencil-Buffr hier direkt nach dem Durchgang des Schattenrenderns über den Bildschirm-Buffer gerendert. Dies hat den Vorteil, dass der Renderprozess schneller ist und keinen Einfluß auf Entities hat, die auf sich selbst keinen Schatten werfen (s. shadow_stencil). Ein Beispiel für einen Poisson-Blur-Shader findet sich in code\st_stencilblur.fx.
- Ist eine render_stencil-Bitmap und/oder ein mtl_shadow-Shader zugewiesen, stencil shadows sind aber inaktiv, wird die Bitmap über sämtliche Entities der Szene gerendert. Auf diese Weise kann es für die letzte Shadow-Map, die aus dem vom Anwender definierten Schattenalgorithmus resultiert, wie etwa PSSM, verwenden. Alle vordefinierten Stencil-Shadow-Postprozessing-Schader, wie etwa der Poisson-Filter, lassen sich dann auf den anwenderdefinierten Shattenalgorithmus anwenden.
- Wenn Sie die render_stencil-Bitmap verwenden, achten Sie darauf, den View-Flag NOSHADOW für sämtliche Views, die generiert werden, aber keine Schatten empfangen sollen, zu setzen. ansonsten wird die Bitmap in die Szene hineingerendert und beeinträchtigt das Generieren der Schatten.
Edition:
C LC
Beispiele:
function main()
{
...
shadow_stencil = 4; // activate z-fail accelerated stencil shadows
effect_load(mtl_shadow,"st_stencilblur.fx"); // autogenerate render_stencil by assigning a stencil shader
...
// st_stencilblur.fx - Poisson blur shader
texture StencilMap; // stencil buffer image in the alpha channel
sampler smpStencil = sampler_state { texture = <StencilMap> };
float4 vecViewPort; // contains viewport pixel size in zw components
static const float fDist = 4.0; // blur factor
static const float fStrength = 0.15; // shadow darkness
static const float2 fTaps_Poisson[12] = {
{-.326,-.406},{-.840,-.074},{-.696, .457},{-.203, .621},
{ .962,-.195},{ .473,-.480},{ .519, .767},{ .185,-.893},
{ .507, .064},{ .896, .412},{-.322,-.933},{-.792,-.598}
};
float4 blurPoissonPS( float2 Tex : TEXCOORD0) : COLOR0
{
float4 Stencil = 0;
for (int i=0; i < NUM_TAPS; i++)
Stencil += tex2D(smpStencil,Tex.xy + fTaps_Poisson[i]*fDist*vecViewPort.zw);
return Stencil * fStrength;
}
technique stencilblur {
pass one {
PixelShader = compile ps_2_0 blurPoissonPS();
}
}
Siehe auch:
VIEW, BMAP, view.bmap, view.stage, view.material, render_target, render_zbuffer, PROCESS_SCREEN, shadow_stencil
► Aktuelle Version Online