Horde3D
http://horde3d.org/forums/

pipeline: copy depth buffer between stages
http://horde3d.org/forums/viewtopic.php?f=2&t=1870
Page 1 of 1

Author:  john [ 13.03.2013, 06:44 ]
Post subject:  pipeline: copy depth buffer between stages

hi
I need to do a simple task: render "static" (walls) and "dynamic" (chars) objects to separate buffers then compine them in my shader and draw quad

ive read alsmost whole forum, tried different tehniques but nothing is working which is sad bucause it should be simple

i know what by default depth buffers dont sharing between FBOs so i need to copy them first and write to gl_FragDepth. i also tried COPY_DEPTH hack from other pipelines with no success.

Attachment:
File comment: no depth in second pass
2013-03-13-092808_800x600_scrot.png
2013-03-13-092808_800x600_scrot.png [ 142.86 KiB | Viewed 25654 times ]


here's my pipeline:
Code:
<!-- Forward Shading Pipeline -->
<Pipeline>
        <Setup>
            <RenderTarget id="BUF0" depthBuf="true" numColBufs="1" format="RGBA8"  scale="1.0" maxSamples="4"/>   
            <RenderTarget id="BUF1" depthBuf="true" numColBufs="1" format="RGBA8"  scale="1.0" maxSamples="4"/>   
        </Setup>
   <CommandQueue>
      <Stage id="StaticPass" link="pipelines/globalSettings.material.xml">
                        <SwitchTarget target="BUF0" />
         <ClearTarget depthBuf="true" colBuf0="true" />
         
         <DrawGeometry context="AMBIENT" class="wall" />
         <DoForwardLightLoop class="wall" />
      </Stage>

      <Stage id="DynamicPass">
         <SwitchTarget target="BUF1" />
         <ClearTarget depthBuf="true" colBuf0="true" />

                        <!-- xxx doesnt work -->
                        <!-- Copy depth buffer to allow occlusion culling of lights -->
                        <!--
                        <BindBuffer sampler="depthBuf" sourceRT="BUF0" bufIndex="32" />
                        <DrawQuad material="materials/light.material.xml" context="COPY_DEPTH" />

                        <UnbindBuffers />
                        -->

         <DrawGeometry context="AMBIENT" class="dynamic" />
         <DoForwardLightLoop class="dynamic" />
      </Stage>

      <Stage id="Translucent">
         <DrawGeometry context="TRANSLUCENT" class="Translucent" order="BACK_TO_FRONT" />
      </Stage>

      <Stage id="TestPass">
         <SwitchTarget target="" />
                        <BindBuffer sampler="buf0" sourceRT="BUF0" bufIndex="0" />
                        <BindBuffer sampler="buf1" sourceRT="BUF1" bufIndex="0" />
                        <DrawQuad material="pipelines/testpass.material.xml" context="TESTPASS" />
         <UnbindBuffers />
      </Stage>

      <Stage id="Overlays">
         <DrawOverlays context="OVERLAY" />
      </Stage>
   </CommandQueue>
</Pipeline>


and shader
Code:
[[FX]]

// depth
sampler2D depthBuf = sampler_state
{
    Address = Clamp;
};
 
// walls
sampler2D buf0 = sampler_state
{
    Address = Clamp;
};

// dynamic
sampler2D buf1 = sampler_state
{
    Address = Clamp;
};

sampler2D fgtex = sampler_state
{
};
 
context TESTPASS
{
    VertexShader = compile GLSL VS_GENERAL;
    PixelShader = compile GLSL FS_GENERAL;
}

context COPY_DEPTH
{
    VertexShader = compile GLSL VS_FSQUAD;
    PixelShader = compile GLSL FS_COPY_DEPTH;
}
 
 
[[VS_GENERAL]]
 
#include "shaders/utilityLib/vertCommon.glsl"

uniform mat4 projMat;
attribute vec3 vertPos;
varying vec2 texCoords;
            
void main(void)
{
   texCoords = vertPos.xy;
   gl_Position = projMat * vec4( vertPos, 1 );
}

         
[[FS_GENERAL]]
 
uniform sampler2D buf0;
uniform sampler2D buf1;
uniform sampler2D fgtex;
varying vec4 pos, vsPos;
varying vec2 texCoords;

void main(void)
{
    vec4 tex0;
    vec4 tex1;
    vec4 tex2;
    vec4 P1;

    tex0 = texture2D(buf0, texCoords);
    tex1 = texture2D(fgtex, texCoords * vec2(1.0, -1.0));
    tex2 = texture2D(buf1, texCoords);

    P1 = tex0 * (tex0 + (2.0 * tex1) * (1.0 - tex0));
    //P1 = tex0 * (tex0 + (1.6 * tex1) * (1.0 - tex0));
    P1 = P1 * (P1 + (2.0 * tex1) * (1.0 - P1));
    P1 = mix(P1, tex2, tex2.a);
    //gl_FragColor = mix(tex0, tex2, tex2.a);

    gl_FragColor = P1;
}


[[VS_FSQUAD]]

uniform mat4 projMat;
attribute vec3 vertPos;
varying vec2 texCoords;

void main( void )
{
texCoords = vertPos.xy;
gl_Position = projMat * vec4( vertPos, 1 );
}


[[FS_COPY_DEPTH]]

uniform sampler2D depthBuf;
varying vec2 texCoords;

void main( void )
{
    gl_FragDepth = texture2D( depthBuf, texCoords ).r;
}

Page 1 of 1 All times are UTC + 1 hour
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/