Edited by amrin, 13 June 2012 - 12:37 AM.
how to draw lines over the terrain
Members - Reputation: 290
Posted 13 June 2012 - 01:52 AM
Render terrain normally.
Disable Ztest& Z write ->draw lines
Re-Enable Ztest&Zwrite->draw other things
this way lines will be always visibile (even if behind a mountain) above terrain, but will not be displayed above other stuff.
Peace and love, now I understand really what it means! Guardian Angels exist! Thanks!
Members - Reputation: 1012
Posted 13 June 2012 - 06:58 AM
maybe this is a little expensive Im not sure but you could just change the colour of the fragment based on the final world position of the pixel. I wasnt able to download your attached image. In the future you should convert it to a jpeg (since its much smaller) and include it in the post itself so im only geussing this is what you want.
So lets say the map extends along the x and y coords you can have something like this in your fragment shader to create grid like lines on your terrain. Best have a seperate shader for your terrain.
if (fragmentPosition.x%20<1 || fragmentPosition.y%20<1) //fragmentPosition is a varraying variable that passes the final vertex position to the fragment shader.
finalColor = vec4(0,0,0,1) //black
finalColor = whatever else it would have been normaly.
This would create a solid black line on the terrain every 20 units on both the x and y axis.
Edited by Wilhelm van Huyssteen, 13 June 2012 - 06:59 AM.
Members - Reputation: 2185
Posted 13 June 2012 - 08:14 AM
As far as I see on the image, you are already doing some king of projection, the lines' geometry seems to follow the terrain. If you are calculating these projected lines "precisely" so without any simplification, then probably you only have to apply some depth bias to the lines, because no matter how precisely you calculate the lines, lines and triangles are rasterized differently + some floating point errors.
Add the bias (try different values untill the result looks okay) to the lines in your fragment shader.
Maybe you can render the lines with some shader magic, I don't know the capabilities of shaders. Maybe you could store the original lines' parameters in a texture and perform the projection in the fragment shader.
calculate the fragment's x and y coordinates in world coordinates, and if the x and y coordinates are near to a line, color the fragment differently. You could even have anti aliased lines this way. This could be very expensive though, maybe you can speed it up with checking against a texture first, which contains the rendered lines. If this test passes, you can go to the more precise check.
Dunno, maybe it's stupid...
Edited by szecs, 13 June 2012 - 08:19 AM.
Members - Reputation: 1795
Posted 13 June 2012 - 08:45 AM
Most often when rendering with a depth bias, I don't have depth-writes enabled, i.e. specify glDepthMask(GL_FALSE), but have depth-testing enabled, i.e. specify glEnable(GL_DEPTH_TEST). Depth-biased renders always occur at the end of the frame, after all opaque geometry have been rendered with z-writes enabled.