diff --git a/Effects/tree.eff b/Effects/tree.eff index 6713511e7..ae0e7839f 100644 --- a/Effects/tree.eff +++ b/Effects/tree.eff @@ -1,6 +1,16 @@ <?xml version="1.0" encoding="utf-8"?> <!-- Effects files for trees, which are placed by a shader. --> +<!-- Trees are drawn in two passes. The first draws the opaque parts + with z writes enabled. The second draws the the transparent bits + with z testing enabled and z writes disabled. The transparent + tree silhouettes will blend correctly against the opaque + geometry. They may cause artifacts when blending against other + edges, but the overall "forest" is supposed to be nice and + fuzzy. There might also be artifacts when blending over other + transparent objects, but that's mostly unavoidable. + + Note: no sorting needed! --> <PropertyList> <name>Effects/tree</name> <parameters> @@ -17,20 +27,16 @@ </less-equal> </and> </predicate> - <pass> + <pass n="0"> <lighting>true</lighting> <material> <ambient type="vec4d">1.0 1.0 1.0 1.0</ambient> <diffuse type="vec4d">1.0 1.0 1.0 1.0</diffuse> <color-mode>off</color-mode> </material> - <render-bin> - <bin-number>2</bin-number> <!-- RANDOM_OBJECTS_BIN --> - <bin-name>DepthSortedBin</bin-name> - </render-bin> <alpha-test> <comparison>gequal</comparison> - <reference type="float">0.33</reference> + <reference type="float">1.0</reference> </alpha-test> <texture-unit> <unit>0</unit> @@ -48,9 +54,46 @@ <type>sampler-2d</type> <value type="int">0</value> </uniform> - <!-- The vertex shader isn't doing two-sided lighting yet, but - should be soon. --> - <vertex-program-two-side type="bool">true</vertex-program-two-side> + </pass> + <pass n="1"> + <lighting>true</lighting> + <material> + <ambient type="vec4d">1.0 1.0 1.0 1.0</ambient> + <diffuse type="vec4d">1.0 1.0 1.0 1.0</diffuse> + <color-mode>off</color-mode> + </material> + <render-bin> + <bin-number>2</bin-number> <!-- RANDOM_OBJECTS_BIN --> + <bin-name>RenderBin</bin-name> + </render-bin> + <alpha-test> + <comparison>less</comparison> + <!-- <reference type="float">0.33</reference> --> + <reference type="float">1.0</reference> + </alpha-test> + <blend> + <source>src-alpha</source> + <destination>one-minus-src-alpha</destination> + </blend> + <depth> + <write-mask>false</write-mask> + </depth> + <texture-unit> + <unit>0</unit> + <type>2d</type> + <image><use>texture[0]/image</use></image> + <wrap-s>clamp</wrap-s> + <wrap-t>clamp</wrap-t> + </texture-unit> + <program> + <vertex-shader>Shaders/tree.vert</vertex-shader> + <fragment-shader>Shaders/tree.frag</fragment-shader> + </program> + <uniform> + <name>baseTexture</name> + <type>sampler-2d</type> + <value type="int">0</value> + </uniform> </pass> </technique> </PropertyList> diff --git a/Shaders/tree.vert b/Shaders/tree.vert index 4c5017243..8b098175e 100644 --- a/Shaders/tree.vert +++ b/Shaders/tree.vert @@ -29,7 +29,6 @@ void main(void) vec3 diffuse = gl_FrontMaterial.diffuse.rgb * max(0.1, n); vec4 ambientColor = gl_FrontLightModelProduct.sceneColor + gl_LightSource[0].ambient * gl_FrontMaterial.ambient; gl_FrontColor = ambientColor + gl_LightSource[0].diffuse * vec4(diffuse, 1.0); - gl_BackColor = gl_FrontColor; float fogCoord = abs(ecPosition.z); fogFactor = exp( -gl_Fog.density * gl_Fog.density * fogCoord * fogCoord);