Add stencil light shaders by Lauri Peltonen (Zan).
Please Note: There is a problem with this implementation when the light cone crosses the near/far camera boundary.
This commit is contained in:
parent
b98fcba700
commit
049a339a52
2 changed files with 127 additions and 1 deletions
126
Effects/light-cone.eff
Normal file
126
Effects/light-cone.eff
Normal file
|
@ -0,0 +1,126 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<!--
|
||||
|
||||
A light "cone" effect, written by Lauri Peltonen (Zan)
|
||||
|
||||
With this effect, any object (most likely a cone) will
|
||||
light up everything inside of it. Might be usefull for
|
||||
landing lights etc.
|
||||
|
||||
Uses stencil buffer.
|
||||
|
||||
-->
|
||||
|
||||
|
||||
<PropertyList>
|
||||
<name>Effects/light-cone</name>
|
||||
<inherits-from>Effects/model-default</inherits-from>
|
||||
<parameters>
|
||||
<texture n ="0">
|
||||
<type>white</type>
|
||||
</texture>
|
||||
|
||||
<!-- Dunno if this does anything, it could be removed
|
||||
what does this do with rendering-hint=transparent? -->
|
||||
<render-bin>
|
||||
<active>true</active>
|
||||
<bin-number>9</bin-number>
|
||||
<bin-name>RenderBin</bin-name>
|
||||
</render-bin>
|
||||
|
||||
</parameters>
|
||||
<technique n="8">
|
||||
|
||||
<!-- First pass, increase stencil when ground is in front of
|
||||
the lighting object -->
|
||||
<pass>
|
||||
<render-bin>
|
||||
<active>true</active>
|
||||
<bin-number>9</bin-number>
|
||||
<bin-name>RenderBin</bin-name>
|
||||
</render-bin>
|
||||
|
||||
<lighting>false</lighting>
|
||||
|
||||
<color-mask type="vec4d">0 0 0 0</color-mask> <!-- do not draw anything -->
|
||||
|
||||
<shade-model><use>shade-model</use></shade-model>
|
||||
<cull-face>front</cull-face>
|
||||
<!-- <rendering-hint>transparent</rendering-hint> -->
|
||||
<depth>
|
||||
<write-mask>false</write-mask>
|
||||
</depth>
|
||||
|
||||
<!-- Set stencil buffer to 1 if ground is in front of the back side
|
||||
of the light volume, otherwise zero -->
|
||||
<stencil>
|
||||
<function>always</function> <!-- S-test passes always -->
|
||||
<value>1</value>
|
||||
<z-fail>replace</z-fail> <!-- Replace current s-buffer with value 1 -->
|
||||
<pass>zero</pass> <!-- Zero everything "behind" the volume -->
|
||||
</stencil>
|
||||
</pass>
|
||||
|
||||
|
||||
<!-- Second pass, decrease stencil when ground is in front of the front
|
||||
side of the volume, in stencil buffer, 1 exists where ground
|
||||
(or other objects) is inside the lighting object! -->
|
||||
<pass>
|
||||
<render-bin>
|
||||
<active>true</active>
|
||||
<bin-number>9</bin-number>
|
||||
<bin-name>RenderBin</bin-name>
|
||||
</render-bin>
|
||||
|
||||
<lighting>false</lighting>
|
||||
<color-mask type="vec4d">0 0 0 0</color-mask> <!-- Do not draw anything -->
|
||||
<shade-model><use>shade-model</use></shade-model>
|
||||
<cull-face>back</cull-face>
|
||||
<!-- <rendering-hint>transparent</rendering-hint> -->
|
||||
<depth>
|
||||
<write-mask>false</write-mask>
|
||||
</depth>
|
||||
|
||||
<!-- Set s-buffer to 0 when ground is in front of the front side of the volume -->
|
||||
<stencil>
|
||||
<function>always</function> <!-- S-test passes always -->
|
||||
<z-fail>zero</z-fail> <!-- Zero s-buffer when z-buffer test fails -->
|
||||
</stencil>
|
||||
</pass>
|
||||
|
||||
<!-- Third pass, render light where there is 1 on stencil buffer -->
|
||||
<pass>
|
||||
<render-bin>
|
||||
<active>true</active>
|
||||
<bin-number>9</bin-number>
|
||||
<bin-name>RenderBin</bin-name>
|
||||
</render-bin>
|
||||
|
||||
<lighting>false</lighting>
|
||||
<shade-model><use>shade-model</use></shade-model>
|
||||
<cull-face>back</cull-face>
|
||||
<!-- <rendering-hint>transparent</rendering-hint> -->
|
||||
<depth>
|
||||
<write-mask>false</write-mask>
|
||||
</depth>
|
||||
|
||||
<!-- Draw when S-buffer EQUALS value 1 -->
|
||||
<stencil>
|
||||
<function>equal</function>
|
||||
<value>1</value>
|
||||
</stencil>
|
||||
|
||||
<!-- Do additive blending, so increase the color value of
|
||||
the existing pixel by the light's color. The light object should
|
||||
have ambient & diffuse AND alpha should be around 0.2 or something -->
|
||||
<blend>
|
||||
<active>true</active>
|
||||
<source>dst-alpha</source>
|
||||
<destination>one</destination>
|
||||
</blend>
|
||||
|
||||
</pass>
|
||||
|
||||
</technique>
|
||||
</PropertyList>
|
|
@ -87,7 +87,7 @@
|
|||
</texture-unit>
|
||||
<program>
|
||||
<vertex-shader>Shaders/default.vert</vertex-shader>
|
||||
<fragment-shader>Shaders/default.frag</fragment-shader>
|
||||
<fragment-shader>Shaders/terrain-default.frag</fragment-shader>
|
||||
</program>
|
||||
<uniform>
|
||||
<name>texture</name>
|
||||
|
|
Loading…
Reference in a new issue