Sign in to follow this  
schupf

"Raycasting" in a pixel shader

Recommended Posts

Hello, I have an application, with renders a skydome with atmospheric scattering. Now I want to replace the skydome with a cube. To to so I have the following algorithm in mind: The camera is always at the center of the cube. I send the five sides (dont need bottom) of the cube to the pipeline and in the vertex shader I calculate a ray from the camera to the current corner vertex of the cube. I store this ray in a texcoord. The rays get interpolated over the cube faces and so I have a ray for every pixel in the pixelshader. My questions: 1) Does this interpolation work? Will the interpolated rays be correct? 2) My second idea: Instead of storing the rays from cam to vertex I could also store the vertexPosition of the cube in a texcoord and then use the interpolated positions in the pixelshader, to calculate the ray. Would this work and if yes: is it better? Thanks for any help!

Share this post


Link to post
Share on other sites
Quote:
Original post by schupf
1) Does this interpolation work? Will the interpolated rays be correct?

Yes, but they won't be normalized.

Quote:
Original post by schupf
2) My second idea: Instead of storing the rays from cam to vertex I could also store the vertexPosition of the cube in a texcoord and then use the interpolated positions in the pixelshader, to calculate the ray. Would this work and if yes: is it better?

Since the cube center is at (0,0,0), this would be exactly the same as method 1.

Share this post


Link to post
Share on other sites
Thanks for your answer!
So Im gonna try the approach with the interpolated rays and normalize them in the pixel shader.

One technical question:
I dont only want to render the box, I want to create a cube texture (to use them for rendering AND reflections). Btw: I am using DX10 and SM4.0.
I guess I have to do the following:
for(i=0; i < 5; i++) {
viewMatrix.setMatrix(viewMatrix[i]);
RenderThisFace(renderTarget[i]);
}

So I have one technique with one pass which does all the "raycasting" in the pixelshader and the result is written to renderTarget[i].
1) But with this approach I need 6 passes (5 to render to the faces and 1 to draw the cube)! I have seen one sample from the DX Docu (CubeMapGS), where they render to all 6 faces simultanously. Unfortunately they just render a complete scene to the faces, while I create the faces with raycasting on the fly. So is there a more efficient way in DX10 to create my cubemap?

2) Im really confused about the new DX10 Resources. What I want: a cube map, that can be used for environment mapping and that can be rendered. Do I need a texture2D Array? Does anyone know some simple code which creates and renders a cubemap in DX10 (I just have found ONE sample "CubeMapGS" and to be honest... its really unclear).

Share this post


Link to post
Share on other sites
Quote:
Original post by schupf
1) But with this approach I need 6 passes (5 to render to the faces and 1 to draw the cube)! I have seen one sample from the DX Docu (CubeMapGS), where they render to all 6 faces simultanously. Unfortunately they just render a complete scene to the faces, while I create the faces with raycasting on the fly. So is there a more efficient way in DX10 to create my cubemap?

You can use the geometry shader stage to render all 5 (or 6) faces in a single pass. This obviously requires GS capable hardware. However, this is still pretty slow on current hardware, slower than doing it the old style way. Next generation hardware will have (much) more powerful geometry shader processing, and the single pass method will probably become the best alternative.

Quote:
Original post by schupf
2) Im really confused about the new DX10 Resources. What I want: a cube map, that can be used for environment mapping and that can be rendered. Do I need a texture2D Array? Does anyone know some simple code which creates and renders a cubemap in DX10 (I just have found ONE sample "CubeMapGS" and to be honest... its really unclear).

I have no idea. I'm an OpenGL guy :)

Share this post


Link to post
Share on other sites
Quote:
Original post by schupf
1) But with this approach I need 6 passes (5 to render to the faces and 1 to draw the cube)! I have seen one sample from the DX Docu (CubeMapGS), where they render to all 6 faces simultanously.

As Yann mentioned, you can render all 6 at a time on DX10 hardware but in my experience it's not actually any faster on current hardware. Simply having a geometry shader - even a trivial/identity one - incurs a performance hit large enough to cover any advantage of avoiding multiple passes/render target changes. Future hardware may change this, but conceptually you're just moving more of your render logic onto the GPU so the code doesn't really change that much in any case.

One other option to look at is different parameterizations than cube maps. Dual-paraboloid maps come to mind, although you have to make sure that your scene is tessellated enough to make up for the fact that rendering into a dual-paraboloid map technically requires non-linear rasterization.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this