update Spheremap Transform algorithm

This commit is contained in:
hyzboy 2020-01-02 21:40:48 +08:00
parent e7e70491b1
commit 1cfb30faea

View File

@ -6,7 +6,7 @@
Normal to GBufffer: Normal to GBufffer:
G=normalize(N.xy)*sqrt(N.z*0.5+0.5) G=normalize(N.xy)*sqrt(-N.z*0.5+0.5)
GBuffer to Normal: GBuffer to Normal:
@ -19,7 +19,7 @@ namespace hgl
void normal_compress(uint8 *x,uint8 *y,const uint8 *rgb,const uint count) void normal_compress(uint8 *x,uint8 *y,const uint8 *rgb,const uint count)
{ {
Vector3f in; Vector3f in;
Vector2f in_xy; float f;
Vector2f out; Vector2f out;
for(uint i=0;i<count;i++) for(uint i=0;i<count;i++)
@ -28,8 +28,11 @@ namespace hgl
in.y=float(*rgb)/255.0f;++rgb; in.y=float(*rgb)/255.0f;++rgb;
in.z=float(*rgb)/255.0f;++rgb; in.z=float(*rgb)/255.0f;++rgb;
in_xy=in.xy().Normalized(); //Spheremap Transform,PSNR 48.071 dB,15 GPU cycles
out=in_xy*sqrt(in.z*0.5+0.5); f=sqrt(8*in.z+8);
out=in.xy()/f+Vector2f(0.5);
out=out.Clamp01();
*x=out.x*255;++x; *x=out.x*255;++x;
*y=out.y*255;++y; *y=out.y*255;++y;
@ -39,20 +42,25 @@ namespace hgl
void normal_decompress(uint8 *rgb,const uint8 *x,const uint8 *y,const uint count) void normal_decompress(uint8 *rgb,const uint8 *x,const uint8 *y,const uint count)
{ {
Vector2f in; Vector2f in;
Vector2f in_normal; Vector2f fenc;
Vector3f out; Vector3f out;
float s; float f,g;
for(uint i=0;i<count;i++) for(uint i=0;i<count;i++)
{ {
in.x=(*x)/255.0f;++x; in.x=(*x)/255.0f;++x;
in.y=(*y)/255.0f;++y; in.y=(*y)/255.0f;++y;
out.z=length(in)*2.0-1; //Spheremap Transform,PSNR 48.071 dB,15 GPU cycles
in_normal=in.Normalized(); fenc=in*4.0f-Vector2f(2.0f);
s=sqrt(1-out.z*out.z); f=dot(fenc,fenc);
out.x=in_normal.x*s; g=sqrt(1.0-f/4.0f);
out.y=in_normal.y*s;
out.x=fenc.x*g;
out.y=fenc.y*g;
out.z=1-f/2.0f;
out=out.Clamp01();
*rgb=out.x*255;++rgb; *rgb=out.x*255;++rgb;
*rgb=out.y*255;++rgb; *rgb=out.y*255;++rgb;