1
0
Fork 0
fgdata/Effects/light-cone.eff

127 lines
3.7 KiB
Text
Raw Normal View History

<?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>