Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 5 of 5

Thread: snow accumulation

  1. #1
    Junior Member Newbie
    Join Date
    Sep 2004
    Posts
    21

    snow accumulation

    Hi all
    I would like to implement the nvidia snow accumulation program in GLSL
    The method consists in rendering the scene into a depthmap from the sky and looking down with a 2D ortho frustum (1st pass). Then using this depthmap and compare depth componant and identify the fragment that will be "snowed" (2nd pass). It really looks like the shadow map method.

    Well I tried to implement this with shaders, but it just does'nt work

    Here is the fragment shader for the 1st pass, it creates the depth map
    Code :
    void main(void)
    {
      float z = gl_FragCoord.z / gl_FragCoord.w;
      gl_FragColor = 1.0 - z;
    }

    Then the vertex shader for the 2nd pass
    Code :
    uniform mat4 mViewFromSky;
    uniform mat4 mProjFromSky;
    varying vec4 texCoord;
     
    void main(void)
    {
      mat4 bias = mat4(0.5, 0.0, 0.0, 0.0,
                      0.0, 0.5, 0.0, 0.0,
    		  0.0, 0.0, 0.5, 0.0,
    		  0.5, 0.5, 0.5, 1.0);
      texCoord = bias * mViewFromSky * mProjFromSky * gl_Vertex;
      texCoord = texCoord / texCoord.w;
      gl_Position = ftransform();
    }
    mViewFromSky is a up located looking down camera model view matrix (like the light model view matrix for a shadowmap)
    mProjFromSky is a 2D ortho camera projection matrix

    Then finally the 2nd pass fragment shader:
    Code :
    uniform sampler2DShadow depthMap;
    varying vec4 texCoord;
    void main(void)
    {
      vec4 color = ComputeFragment();
     
      float depthMapDepth = shadow2DProj(depthMap, texCoord).x;
      if(depthMapDepth == 0.0)
        color = vec4(1,1,1,1);
     
      gl_FragColor = color;
    }

    My idea is to use shadow2D GLSL function to know if the fragment is "snowed" or not.

    My problem is that all my object are white now ...

    I think my problem may come from the texCoord computing, but I really do not know how to compute it.

    Any help much appreciated ...

    thanks

  2. #2
    Senior Member OpenGL Pro
    Join Date
    Sep 2004
    Location
    Prombaatu
    Posts
    1,401

    Re: snow accumulation

    Cool idea. Have a link to the original code handy?

    For starters it looks like you're comparing a post projective z to a linear z computed in your first pass (or not).

    Your second pass order of transformations strikes me a bit fishy. Try swapping view and proj.

    (shadow2DProj is deprecated...)

    ...

  3. #3
    Junior Member Newbie
    Join Date
    Sep 2004
    Posts
    21

    Re: snow accumulation

    Firstable thanks a lot for your answer

    You can find the nvidia orignal code on this page (look for snow accumulation) http://http.download.nvidia.com/deve...s/samples.html

    Here is the whitepaper : http://http.download.nvidia.com/develope...ccumulation.pdf


    Well, I swapped proj and view matrix, you were right, I have now some results.
    But the depthmap is not projected correctly...

    here is the new shaders
    1st pass fragment shader (depthmap calculation):
    Code :
    void main(void)
    {
      float z = gl_FragCoord.z;
      gl_FragColor = 1.0 - z;
    }

    2nd pass vertex shader
    Code :
    uniform mat4 mViewFromSky;
    uniform mat4 mProjFromSky;
    varying vec4 texCoord;
    void main(void)
    {
      mat4 bias = mat4(0.5, 0.0, 0.0, 0.0,
                      0.0, 0.5, 0.0, 0.0,
    		  0.0, 0.0, 0.5, 0.0,
    		  0.5, 0.5, 0.5, 1.0);
      texCoord = bias * mProjFromSky * mViewFromSky * gl_Vertex;
      gl_Position = ftransform();
    }
    and 2nd pass fragment shader
    Code :
    uniform sampler2DShadow depthMap;
    varying vec4 texCoord;
    void main(void)
    {
      vec4 color = ComputeFragment();
     
      float depthMapDepth = shadow2D(depthMap, texCoord).x;
      if(depthMapDepth == 0.0)
        color = vec4(1,1,1,1);
     
      gl_FragColor = color;
    }

    (no more shadow2DProj, you right)
    As you can see in my screenshots, the depthmap is not correctly projected on my object, have no idea why. I have checked mViewFromSky and mProjFromSky, they are correct, they contain my 2nd camera model view and projection matrix.
    Have you got another brilliant idea ? ^^

    here is the depthmap, view from my 2nd camera, (rendering to texture)


    here my 2nd pass shader result

    the depthmap is projected on the both sides of the cow.

  4. #4
    Junior Member Newbie
    Join Date
    Sep 2004
    Posts
    21

    Re: snow accumulation

    Ok I think I finaly did it !

    I am using OpenSceneGraph for my application (maybe you have recognize the OSG's cow...)

    I think my problem is that OSG space is different from OpenGL classic space.
    In OSG, Z axis is up, Y is on -Z, and X is the same. My bad, I didn't think about it.

    So I need to rotate the model view matrix with a -PI/2 angle on the X axis before passing it to my shader.

    Now the shadow is correctly projected on my scene. I can go on with the snow accumulation method.

  5. #5
    Junior Member Newbie
    Join Date
    Sep 2004
    Posts
    21

    Re: snow accumulation

    Hi again
    My snow accumulation shaders are now working


    But I would like to make a snow trail on the snow receivers surface (my plane) when an animated object (the little sphere) is moving over it (hope I am clear enought ...)

    Does anyone have any idea of how doing that with shaders ?
    Is it possible ?

    thx

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •