8

While there is some interesting research into order-independent transparency rendering, it's extremely complex to implement. And even sorting individual leaves can still cause artifacts where one leaf overlaps itself. So your safest bet is probably Alpha Testing. This is where you specify a threshold opacity value; anything above that value is rendered 100% ...


7

You use: glClearColor(r, g, b, a) to set the color of glClear(GL_COLOR_BUFFER_BIT) glClearDepth(depth) for the depth buffer glClearStencil(stencil) for the stencil buffer Alternatively, you can use glDepthFunc to change the way the depth buffer is tested.


6

It's important to note that glxinfo -v only reports the supported values for the default OpenGL framebuffer, the one that represents the visible screen itself. It's common for other configurations (ones not reported by glxinfo) to be supported in offscreen framebuffer objects (FBOs). As you've noticed, most video cards do not support a 32-bit depth buffer ...


5

You can use the function glClearDepth where you can specify what to clear the depth buffer to. http://www.opengl.org/sdk/docs/man/xhtml/glClearDepth.xml however I think glClear() clears the depth buffer to 1.0 by default. glClear sets the bitplane area of the window to values previously selected by glClearColor, glClearDepth, and glClearStencil As ...


5

I found the answer in a related question The problem was my depth buffer. As I was using a spritebuffer in my main draw spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend); Some GraphicsDevice properties were incorrect. BlendState value was AlphaBlend and DepthStencilState was none. In order to fix this only have to add two lines at the ...


5

Quick answer: Z is not a linear function of (X', Y'), but 1/Z is. Since you interpolate linearly, you get correct results for 1/Z, but not for Z. You don't notice because as long as the comparison between Z1 and Z2 is correct, the zbuffer will do the right thing, even if both values are wrong. You will definitely notice when you add texture mapping (and to ...


5

The general rule of thumb when drawing alpha polys is: 1 - Draw all solid polys first. 2 - Sort back to front if you can. The main reason for this is to ensure that the final colour produced by the blending equation is consistent frame to frame. I often don't bother with this step unless it is something provided by the engine and I can justify the extra ...


5

so, to rework from comments: this is Z-fighting. The math is very well explained here: http://chaosinmotion.com/blog/?p=555, and the ways to solve it here: https://www.opengl.org/wiki/Depth_Buffer_Precision, but the gist is that Z-buffer is discrete, non-linear, and depends on the ratio of farplane/nearplane. discrete: the distance between near and far ...


5

In the Unity docs under shader references. Shadow mapping macros Declaring and sampling shadow maps can be very different depending on the platform, so Unity has several macros to help with that: UNITY_DECLARE_SHADOWMAP(tex) - declares a shadowmap texture variable with name “tex”. UNITY_SAMPLE_SHADOW(tex,uv) - samples shadowmap texture “tex” at given “uv”...


5

Indeed, the values stored in the z-buffer are not linear to the actual z coordinates of your objects, but to their reciprocal, in order to give more resolution to what's near the eye than to what's closer to the back plane. What you do is that you map your zNear to 0 and your zFar to 1. For zNear=1 and zFar=2, it should look like this The way to calculate ...


5

Solution I used good algorithm for depth linearization but I didn't convert depth to NDC first: const float near = 0.1; // projection matrix's near plane const float far = 90.0; // projection matrix's far plane float LinearizeDepth(float depth) { float z = depth * 2.0 - 1.0; // back to NDC return (2.0 * near * far) / (far + near - z * (far - near))...


5

"Z-buffers" and "raytracing" are not mutually exclusive. Z-buffers are frequently used to support triangle-based, back-projected rendering (though they are optional in actual usage), and they can also be used to support raytracing. Equating z-buffers to traditional GPU polygon-based, back-projected rendering, just because these are often found together, is ...


4

I think what you're looking for is called "Conservative Depth". There is an AMD OpenGL extension at least: GL_AMD_conservative_depth But there is also a DX11 semantic which I have used in the past and works on both vendors, although it is poorly documented. It's described here on slide 81. As for OpenGL on NVIDIA, I'm not sure. There is GL_ARB_depth_clamp, ...


4

You will need an active edge list, which contains a list of all polygon edges intersected by the current scanline. You will also need an in/out flag for each polygon on the scanline. The flags are toggled on/of as you cross an edge for a polygon. The rules are drawing for each pixel along a scanline are; no polygon flags are 'in', then draw background ...


4

The problem is caused by the SpriteBatch.Begin() changing some of the rendering states. This problem is solved in XNA 3.1 and earlier by using the SaveState flag (see this answer). However in XNA 4.0+ you need to restore the state yourself. Insert the following code after your sprite drawing but before your model drawing (or 3D primitive drawing) ...


4

Floating-point depth buffers would enhance range if they actually stored non-normalized depth values. You have a choice between 32-bit fixed-point or 32-bit floating-point depth, for all other bit-depths the depth buffer is always fixed-point. So compared to a 24-bit or 16-bit depth buffer, a floating-point depth buffer always has enhanced precision... but ...


4

It's completely automatic, so long as you don't do anything that might implicitly disable it. Early Z and such are hardware optimizations, meaning that they're things hardware might do and are allowed to do or not to do as the result of early Z has no effect on the rendered image other than speed. It's similar to how a compiler or even CPU is allowed to ...


4

This is actually a quite simple thing to do. Use your "heightmap" as a texture input to the shader of your sprite. Then simply add the heightmap height to the fragment depth inside the shader. Here's a little example fragment shader: uniform sampler2D heightmap; void main(void) { gl_FragDepth = gl_FragCoord.z + texture2D(heightmap, ...


4

Basically if you number X and Y iso-coordinates their sum is the number of the diagonal, you sort tiles by diagonal, and then draw first tiles with lower Z. This is indipendent of screen coordinates. (of course assuming the camera is in the bottom left corner of the image)


4

The result sampled from gbuffer_texture[2] will be in the [0, 1] range, but in OpenGL, NDC space ranges from -1 to 1 along all three axes. (This is different from D3D, where the NDC space ranges from 0 to 1 along the z axis.) So, you need to multiply the depth result by 2 and subtract 1 to convert the range to [-1, 1], just as you're doing already for the ...


4

1: camera space, like Andon said. 2: the projection matrix contains those Fx,Fy values (f and f/aspect) at cells [0][0] and [1][1] see https://www.opengl.org/sdk/docs/man2/xhtml/gluPerspective.xml 2x/Vx-1.0 is to convert from screen pixel coordinates which are from (0, 0) to (WIDTH, HEIGHT) to 3D projected coordinates that are from -1 to 1. 3: the "real" ...


4

Yes, your Z value, distToCamera, will be correct at each triangle's vertices, but won't be anywhere else (except between vertices of matching Z-value), because of linear interpolation. Edit: In current GLSL, the default interpolation is "in perspective", where gl_Position/gl_FragCoord is taken into account for interpolating. This can be overridden (you won'...


4

Your depth buffer does not contain "entities". It contains the stuff you rendered. So if you read the depth buffer, you will read the depth for the closest stuff you rendered. So either you make a special depth-only rendering pass that does not contain "entities", or you're going to have to do something else to convert from the user's selected location to a ...


4

You should perform the depth test in the fragment shader "manually". OpenGL doesn't support multiple depth tests, and that its just what you need to render the second nearest pixels, because: You need the second front pixels (GL_LESS over the actual depth buffer) You need the second front pixels (GL_GREATER over the depth buffer of the first framebuffer). ...


3

The problem with the models overlapping after ToggleFullscreen() is that the Depth Stencil View also needs to be recreated when the back buffer is resized. I made these modifications to ToggleFullscreen(): ... D3D11_TEXTURE2D_DESC depthBufferDesc; D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc; depthStencilView->Release(); depthStencilBuffer->...


3

The closest answer I can find is from the DXSDK article "Depth Buffers (Direct3D 9)"; relevant portion extracted (with some parts about the color buffer and w-buffers removed): At the beginning of the test, the depth value in the depth buffer is set to the largest possible value for the scene. Each polygon in the scene is tested to see if it intersects ...


3

Here is some demo code which shows how it works: // create a temporary texture D3D11_TEXTURE2D_DESC desc; depthStencilTexture->GetDesc(&desc); desc.Usage = D3D11_USAGE_STAGING; desc.BindFlags = 0; desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; desc.MiscFlags = 0; ID3D11Texture2D* tmpTexture = nullptr; HRESULT hr = getDevice()->...


3

A smart bubble/insertion sort is faster than quick sort when the array is already mostly sorted (reused on the next frame). To speed up the copy of data rather than copying entire vertex values use an index buffer to sort the vertices. When you remove quads you can quickly degenerate them (set all vertices to the same value) instead of removing them and ...


3

A common mistake is to zero out MinDepth and MaxDepth of the D3D11_VIEWPORT, effectively clamping all depth to the near plane. The default depth states are test enabled, write enabled, compare less. See the list at MSDN. In Direct3D 11, normalized device coordinates in clip space after W division run from [-1.0, +1.0] on the X and Y axes, and (0.0, 1.0] on ...


3

After much trial and error and Google-fu, I've come across a texture blend shader that gave a similar effect to what you wanted. After a bit of tinkering I've achieved a satisfactory result. What this shader does, is that it blends the mesh right below itself and it'd normally add some sort of transparency effect to the material. I've modified the values ...


Only top voted, non community-wiki answers of a minimum length are eligible