• Advertisement

DX11 Tiled Shading - Cone Culling

Recommended Posts

Hey,

I found a very interesting blog post here: https://bartwronski.com/2017/04/13/cull-that-cone/

However, I didn't really got how to use his "TestConeVsSphere" test in 3D (last piece of code on his post). I have the frustumCorners of a 2D Tile cell in ViewSpace and my 3D Cone Origin and Direction, so where to place the "testSphere"? I thought about to also move the Cone into viewspace and put the sphere to the Center of the Cell with the radius of half-cellsize, however what about depth? A sphere does not have inf depth?

I am missing anything? Any Ideas?

Thx, Thomas

Share this post


Link to post
Share on other sites
Advertisement

If you have the corners of your frustum slice, then you should be able to fit a bounding sphere to those points using any of the common sphere-from-points algorithms. Depending on what projection matrix you use and how you're generating your sub-frusta you may be able to make some assumptions that you can use to quickly compute your sphere, but you have to careful with that. In the typical case of projection matrices, the sub-frusta will be non-symmetrical (they will appear skewed towards the corners of the screen), and the points on the rear plane will be more spread out than the points on the front plane.

Share this post


Link to post
Share on other sites

While I am using Tiled Based Shading I don't have any tile slices because its only 2D.. Sure in case of clustered shading it would make sense to place a sphere in a cell, because the cells are placed in depth too. In my case I only have 2D grid cells where I need to check if a cone will be visible on that tile..

Actually I tried some complex Ray/Cone test where I shot rays from the corners+center of a cell. That works, but because I only check 5 points, there are still cases where the test fails.. and also its not very fast..

I think the solution is easier as it looks.. While my tiles are only 2D also the cone should be also converted in  a 2D triangle.. I only need to find a way to test a 2D rectangle/triangle for intersection plus the case when the camera is within the cone..

Share this post


Link to post
Share on other sites

There are many variants of "tile based shading", so you'll have to adapt your culling based on your particular approach. If you're only using a single Z partition that isn't fit to the depth buffer, then your sub-frustum will extend all the way from the camera's near clipping plane to the far clipping plane. In such a case your sub-frusta will typically by very long and skinny, in which case a bounding sphere can be a poor fit:

59c821c7eceb2_Sub-FrustumBoundingSphere.png.7b6b3608e75d3c0a7509d2e7bd82a563.png

A 3D cone is not a triangle under perspective projection, so your 2D approach wouldn't work. 

 

Share this post


Link to post
Share on other sites

Yes you are right, a sphere-test does not make sense in that case.  You are sure about the 2D approach? Finally any cone I would draw in 3D will appear as a triangle on screen (apart from the cam-in-cone situation).. ?  So if I could calculate that Triangle, it should be only a tri<>rect or tri<>circle test

Share this post


Link to post
Share on other sites

Just go ahead and look at an image of a cone under projection, like this one: 3d_cone.png

It's very clearly not a triangle in 2D. You could possibly fit a triangle to the cone, but I don't know if there's a (cheap) algorithm for doing that.

Share this post


Link to post
Share on other sites

Hey,

triangles.png.b1da692ac76cdb7fcab8efde886a7932.png

not sure how to call it but I think its called "Infinite Cone"? Yes there should be still cases where this will fail, like when looking mostly in same direction as the cone, so you wouln't get the roundings on the end but in my case this would'nt be a problem.

BTW: like your blog a lot! nice work!

 

Edited by thmfrnk

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


  • Advertisement
  • Advertisement
  • Popular Tags

  • Advertisement
  • Popular Now

  • Similar Content

    • By Fleshbits
      Back around 2006 I spent a good year or two reading books, articles on this site, and gobbling up everything game dev related I could. I started an engine in DX10 and got through basics. I eventually gave up, because I couldn't do the harder things.
      Now, my C++ is 12 years stronger, my mind is trained better, and I am thinking of giving it another go.
      Alot has changed. There is no more SDK, there is evidently a DX Toolkit, XNA died, all the sweet sites I used to go to are 404, and google searches all point to Unity and Unreal.
      I plainly don't like Unity or Unreal, but might learn them for reference.
      So, what is the current path? Does everyone pretty much use the DX Toolkit? Should I start there? I also read that DX12 is just expert level DX11, so I guess I am going DX 11.
      Is there a current and up to date list of learning resources anywhere?  I am about tired of 404s..
       
       
    • By Stewie.G
      Hi,
       
      I've been trying to implement a basic gaussian blur using the gaussian formula, and here is what it looks like so far:
      float gaussian(float x, float sigma)
      {
          float pi = 3.14159;
          float sigma_square = sigma * sigma;
          float a = 1 / sqrt(2 * pi*sigma_square);
          float b = exp(-((x*x) / (2 * sigma_square)));
          return a * b;
      }
      My problem is that I don't quite know what sigma should be.
      It seems that if I provide a random value for sigma, weights in my kernel won't add up to 1.
      So I ended up calling my gaussian function with sigma == 1, which gives me weights adding up to 1, but also a very subtle blur.
      Here is what my kernel looks like with sigma == 1
              [0]    0.0033238872995488885    
              [1]    0.023804742479357766    
              [2]    0.09713820127276819    
              [3]    0.22585307043511713    
              [4]    0.29920669915475656    
              [5]    0.22585307043511713    
              [6]    0.09713820127276819    
              [7]    0.023804742479357766    
              [8]    0.0033238872995488885    
       
      I would have liked it to be more "rounded" at the top, or a better spread instead of wasting [0], [1], [2] with values bellow 0.1.
      Based on my experiments, the key to this is to provide a different sigma, but if I do, my kernel values no longer adds up to 1, which results to a darker blur.
      I've found this post 
      ... which helped me a bit, but I am really confused with this the part where he divide sigma by 3.
      Can someone please explain how sigma works? How is it related to my kernel size, how can I balance my weights with different sigmas, ect...
       
      Thanks :-)
    • By mc_wiggly_fingers
      Is it possible to asynchronously create a Texture2D using DirectX11?
      I have a native Unity plugin that downloads 8K textures from a server and displays them to the user for a VR application. This works well, but there's a large frame drop when calling CreateTexture2D. To remedy this, I've tried creating a separate thread that creates the texture, but the frame drop is still present.
      Is there anything else that I could do to prevent that frame drop from occuring?
    • By cambalinho
      i'm trying draw a circule using math:
      class coordenates { public: coordenates(float x=0, float y=0) { X = x; Y = y; } float X; float Y; }; coordenates RotationPoints(coordenates ActualPosition, double angle) { coordenates NewPosition; NewPosition.X = ActualPosition.X*sin(angle) - ActualPosition.Y*sin(angle); NewPosition.Y = ActualPosition.Y*cos(angle) + ActualPosition.X*cos(angle); return NewPosition; } but now i know that these have 1 problem, because i don't use the orign.
      even so i'm getting problems on how i can rotate the point.
      these coordinates works between -1 and 1 floating points.
      can anyone advice more for i create the circule?
    • By isu diss
      I managed convert opengl code on http://john-chapman-graphics.blogspot.co.uk/2013/02/pseudo-lens-flare.html to hlsl, but unfortunately I don't know how to add it to my atmospheric scattering code (Sky - first image). Can anyone help me?
      I tried to bind the sky texture as SRV and implement lens flare code in pixel shader, I don't know how to separate them (second image)


  • Advertisement