#include #include #include"ILImage.h" #include #include #include #include using namespace hgl; using namespace hgl::util; #if HGL_OS == HGL_OS_Windows #define std_cout std::wcout #else #define std_cout std::cout #endif// namespace hgl { constexpr double TWO_SQRT=1.414213562373095; //2的开方,unreal用的这个 template const T clamp(const T &in,const T min_v,const T max_v) { if(inmax_v)return max_v; return in; } const double clamp(const double &in) { return clamp(in,0.0f,1.0f); } constexpr double clamp_u=0.436*255.0; constexpr double clamp_v=0.615*255.0; void RGB2YUV(uint8 *y,uint8 *u,uint8 *v,const uint8 *rgb,const uint count,const double gamma) { uint8 r,g,b; for(uint i=0;i void MixRGB(T *rgb,const T *r,const T *g,const T *b,const uint count) { for(uint i=0;i void MixRGBA(T *rgba,const T *r,const T *g,const T *b,const T *a,const uint count) { for(uint i=0;i void MixRGBA(T *rgba,const T *rgb,const T *a,const uint count) { for(uint i=0;i pixels=new uint8[w*h*4]; MixRGBA(pixels,rgb,a,w*h); if(SaveImageToFile(out_filename,w,h,scale,4,IL_UNSIGNED_BYTE,pixels)) { std_cout< pixels=new uint8[w*h*4]; MixRGBA(pixels,r,g,b,a,w*h); if(SaveImageToFile(out_filename,w,h,scale,4,IL_UNSIGNED_BYTE,pixels)) { std_cout< pixels=new uint8[w*h*3]; MixRGB(pixels,r,g,b,w*h); if(SaveImageToFile(out_filename,w,h,scale,3,IL_UNSIGNED_BYTE,pixels)) { std_cout< MPBR Color.png Normal.png Metallic.png Roughness.png [/gamma:2.2]"< 4RGB Color1.png Color2.png Color3.png Color4.png [/gamma:2.2]"< 2CN Color1.png Normal1.png Color2.png Normal2.png [/gamma:2.2]"< C2G1 Color1.png Color2.png Grayscale.png"< MPBR6 Color.png Matallic.png Roughness.png Grayscale.png"< MPBR7 Color.png Matallic.png Roughness.png Grayscale1.png Grayscale2.png"<7?GetArgGamma(argv[7]):1.0f); color.ToRGB(); normal.ToRGB(); metallic.ToGray(); roughness.ToGray(); w=color.width(); h=color.height(); normal.Resize(w,h); metallic.Resize(w,h); roughness.Resize(w,h); const uint pixel_total=w*h; AutoDeleteArray y=new uint8[pixel_total]; AutoDeleteArray u=new uint8[pixel_total]; AutoDeleteArray v=new uint8[pixel_total]; RGB2YUV(y,u,v,(uint8 *)color.GetRGB(IL_UNSIGNED_BYTE),pixel_total,gamma); SaveRGBAFile( argv[1], w,h,1.0, (uint8 *)normal.GetRGB(IL_UNSIGNED_BYTE), y, OS_TEXT("NormalLuma")); SaveRGBAFile( argv[1], w,h,0.5, u,v, (uint8 *)metallic.GetLum(IL_UNSIGNED_BYTE), (uint8 *)roughness.GetLum(IL_UNSIGNED_BYTE), OS_TEXT("CbCrMR")); } else if(stricmp(argv[2],"4RGB")==0) { ILImage rgb[4]; uint w,h; if(!rgb[0].LoadFile(argv[3]))return 1; if(!rgb[1].LoadFile(argv[4]))return 1; if(!rgb[2].LoadFile(argv[5]))return 1; if(!rgb[3].LoadFile(argv[6]))return 1; double gamma=(argc>7?GetArgGamma(argv[7]):1.0f); rgb[0].ToRGB(); rgb[1].ToRGB(); rgb[2].ToRGB(); rgb[3].ToRGB(); w=rgb[0].width(); h=rgb[0].height(); rgb[1].Resize(w,h); rgb[2].Resize(w,h); rgb[3].Resize(w,h); const uint pixel_total=w*h; AutoDeleteArray y[4],u[4],v[4]; for(uint i=0;i<4;i++) { y[i]=new uint8[pixel_total]; u[i]=new uint8[pixel_total]; v[i]=new uint8[pixel_total]; RGB2YUV(y[i],u[i],v[i],(uint8 *)rgb[i].GetRGB(IL_UNSIGNED_BYTE),pixel_total,gamma); } SaveRGBAFile( argv[1], w,h,1.0, y[0],y[1],y[2],y[3], OS_TEXT("4Luma")); SaveRGBAFile( argv[1], w,h,0.5, u[0],u[1],u[2],u[3], OS_TEXT("4Cb")); SaveRGBAFile( argv[1], w,h,0.5, v[0],v[1],v[2],v[3], OS_TEXT("4Cr")); } else if(stricmp(argv[2],"2CN")==0) { ILImage color[2],normal[2]; uint w,h; if(!color[0].LoadFile(argv[3]))return(1); if(!normal[0].LoadFile(argv[4]))return(1); if(!color[1].LoadFile(argv[5]))return(1); if(!normal[1].LoadFile(argv[6]))return(1); double gamma=(argc>7?GetArgGamma(argv[7]):1.0f); color[0].ToRGB(); normal[0].ToRGB(); color[1].ToRGB(); normal[1].ToRGB(); w=color[0].width(); h=color[0].height(); color[1].Resize(w,h); normal[0].Resize(w,h); normal[1].Resize(w,h); const uint pixel_total=w*h; AutoDeleteArray y[2],u[2],v[2]; for(uint i=0;i<2;i++) { y[i]=new uint8[pixel_total]; u[i]=new uint8[pixel_total]; v[i]=new uint8[pixel_total]; RGB2YUV(y[i],u[i],v[i],(uint8 *)color[i].GetRGB(IL_UNSIGNED_BYTE),pixel_total,gamma); } SaveRGBAFile( argv[1], w,h,1.0, (uint8 *)normal[0].GetRGB(IL_UNSIGNED_BYTE), y[0], OS_TEXT("NormalLuma1")); SaveRGBAFile( argv[1], w,h,1.0, (uint8 *)normal[1].GetRGB(IL_UNSIGNED_BYTE), y[1], OS_TEXT("NormalLuma2")); SaveRGBAFile( argv[1], w,h,0.5, u[0],v[0], u[1],v[1], OS_TEXT("2CbCr")); } ilShutDown(); return 0; }