CryEngine GBuffer Normal storing technique

Started by
3 comments, last by MichaelCat 10 years, 9 months ago

Hi!

I am creating an engine on XNA 4.0 that utilizes deferred shading technique. My GBuffer is 4 R8G8B8A8 textures for Albedo, Depth, Normals and Lights, where Normals were stored like R - N.x, G - N.y, B - N.z. I was dissatisfied with the quality of my specular highlights, especially when I saw how they look when normals are stored with 16 bit precision so I started searching for other techniques. Right now I settled on CryEngine2 technique of Spheremap Transforms that stores only N.x and N.y and reconstructs N.z. Here is the link to the PPt file:

http://www.crytek.com/sites/default/files/A_bit_more_deferred_-_CryEngine3.ppt

I did it just like the slide #13 suggests and everything looks awesome, though a little different from the original approach, but I am in doubt whether I did it correctly. The problem is, their formula of normals deconstruction has this part: "N.z = length2(G.xy)" and I don't know what length2 means. I simply used "length(G.xy)" there and gave the formula a float2 vector (G.xy), just like in the slide. Is that correct? I also tried "length (G.x - G.y)" and it gives a totally different result.

Would be grateful for any advise/link.

Thanks!

Advertisement

There's an implementation in this article. I haven't tried it myself but seems to produce good results.

You know the length has to be one. So solving for z it should be sqrt(1-x^2-y^2) where x is G.x and y is G.y. So in that case your N.z should N.z=sqrt(1-(G.x*G.x)-(G.y*G.y)).

Ok the code in the article is either wrong or improperly explained. Firstly it seems to constantly compute imaginary square roots, which leads to errors, but when I solved it with abs() the ligts it produces are absolutely stupid.

The BornToCode's advise (sqrt(1-(G.x*G.x)-(G.y*G.y))) also led to wrong results. The author seems to have mistaken the Guerilla's approach to normal packing with CryTech's one.

I ended up using normal packing technique from Crysis 3. Thankfully they explained it quite well in their presentation.

This topic is closed to new replies.

Advertisement