Portal based visibility checks

Started by
4 comments, last by Expandable 18 years, 1 month ago
Hello everybody, I need your help. I've been working on this problem for two days now and I still didn't even get closer to a solution. I use portals for visibility determination (very similar to DOOM 3's system). So I have an area, where the camera is in. I draw that area. I extract the 3d view frustum from the OpenGL matrices. If a portal of the current area is within the frustum, I also draw the portal's other area. That works fine. My problem is: In that other area, I have to check if any other portals are visible. Now how do I do that? I can't use the OpenGL matrices for that, but I have to recalculate the frustum. Now the near clipping plane is the portal itself. I thought it would'nt be too difficult to geometrically construct the frustum, but I never got that working. So I searched for some tutorials, and I read that it would be easier to transform the portal's vertices into 2D coordinates on the screen. I came up with my own solution do to this, after that I found out that gluProject() would've done the same thing for me. But oddly enough, my own solution as well as gluProject() produce the same output - which can't be right, though. Or did I missunderstand what gluProject does? I thought that a vertex, let's say it's positioned at (22, 11, -33) and drawn as a point, has specific 2D coordinates, let's say (443, 222). So if I let gluProject() calculate the 2D coordinates of (22, 11, -33), shouldn't the output be (443, 222)? Meaning that, if I draw the vertex (22, 11, -33) in 3D first, and after that I draw the vertex (443, 222) in 2D, only the 2D vertex should be visible as it overdraws the 3D vertex? I really need some help here, so thanks a lot in advance!
Advertisement
I think you're overthinking things. Create each plane from the cameras position, and the 2 vertices of an edge from your portal.
This is not gonna to do the trick,since the vertexes might be outside the frustum while some part of,containing no vertexes might be inside and not obscured by any occluder.
I do portal checking by combined frustum test(for Bounding box of the portal) and Occlusion Queries.Works like silk.
By the way,gluProject//UnProject yields quite strange results sometimes...my own experience.
Read specification for more detail.
Quote:Original post by DarkMessiaH
This is not gonna to do the trick,since the vertexes might be outside the frustum while some part of,containing no vertexes might be inside and not obscured by any occluder.
I do portal checking by combined frustum test(for Bounding box of the portal) and Occlusion Queries.Works like silk.


Edit: Nonsense... I thought about occlusion queries. But the problem is that I do NOT want to draw the portal itself... and I'm already drawing my geometry while still performing portal visiblity checks... how do you do that?

Furthermore, if you use frustum culling, how do you calculate the frustum? I mean, the current view frustum can easily be extracted from the OpenGL matrices, but all other frustums, where the near plane is the portal itself, have to be geometrically constructed. I had the problem that I didn't know how to verify that all normals are facing inwards... but anyway, I'm more into the 2d approach now, I think I might get it to work correctly... but any help would still be appreciated!

[Edited by - Expandable on March 7, 2006 7:29:20 PM]
Quote:Original post by DarkMessiaH
I do portal checking by combined frustum test(for Bounding box of the portal) and Occlusion Queries.Works like silk.


You're right.

I just implemented the portal visibility checking by using occulsion queries . The code is extremly elegant and it works perfectly. In fact, it works by far better than I expected, because if you draw the area you're currently in and then
check the visibility of the portals of that area with occlusion queries you also don't draw the portal if it's behind your geometry... and that check is basically for free if you use occlusion queries anyways... If you repeat these steps for every visible area/portal you have an extremly good culling mechanism!

So thanks for your help!

The only problem I have now is that when you are too close to a portal, the portal seems to be outside the view frustum (between the camera and the near clipping plane), so the next area is not rendered. Hmm... any ideas?

This topic is closed to new replies.

Advertisement