Add normal encoding test.

pull/216/head
castano 13 years ago
parent 28592e73a8
commit 9302ee2cb0

@ -1564,6 +1564,8 @@ void TexImage::transformNormals(NormalTransform xform)
detach(); detach();
m->image->expandNormals(0);
const uint count = m->image->width() * m->image->height(); const uint count = m->image->width() * m->image->height();
for (uint i = 0; i < count; i++) { for (uint i = 0; i < count; i++) {
float & x = m->image->pixel(i, 0); float & x = m->image->pixel(i, 0);
@ -1596,6 +1598,8 @@ void TexImage::transformNormals(NormalTransform xform)
y = n.y; y = n.y;
z = n.z; z = n.z;
} }
m->image->packNormals(0);
} }
void TexImage::reconstructNormals(NormalTransform xform) void TexImage::reconstructNormals(NormalTransform xform)
@ -1604,6 +1608,8 @@ void TexImage::reconstructNormals(NormalTransform xform)
detach(); detach();
m->image->expandNormals(0);
const uint count = m->image->width() * m->image->height(); const uint count = m->image->width() * m->image->height();
for (uint i = 0; i < count; i++) { for (uint i = 0; i < count; i++) {
float & x = m->image->pixel(i, 0); float & x = m->image->pixel(i, 0);
@ -1612,10 +1618,10 @@ void TexImage::reconstructNormals(NormalTransform xform)
Vector3 n(x, y, z); Vector3 n(x, y, z);
if (xform == NormalTransform_Orthographic) { if (xform == NormalTransform_Orthographic) {
n.z = sqrtf(n.x * n.x + n.y * n.y); n.z = sqrtf(1 - nv::clamp(n.x * n.x + n.y * n.y, 0.0f, 1.0f));
} }
else if (xform == NormalTransform_Stereographic) { else if (xform == NormalTransform_Stereographic) {
float denom = 2.0f / (1 + n.x * n.x + n.y * n.y); float denom = 2.0f / (1 + nv::clamp(n.x * n.x + n.y * n.y, 0.0f, 1.0f));
n.x *= denom; n.x *= denom;
n.y *= denom; n.y *= denom;
n.z = denom - 1; n.z = denom - 1;
@ -1631,6 +1637,8 @@ void TexImage::reconstructNormals(NormalTransform xform)
y = n.y; y = n.y;
z = n.z; z = n.z;
} }
m->image->packNormals(0);
} }
void TexImage::flipVertically() void TexImage::flipVertically()

@ -151,6 +151,25 @@ static const char * s_witnessLmapImageSet[] = {
"tower.dds", "tower.dds",
}; };
static const char * s_normalMapImageSet[] = {
"01_dot1.png",
"02_dot2.png",
"03_dot3.png",
"04_dot4.png",
"05_lumpy.png",
"06_voronoi.png",
"07_turtle.png",
"08_normalmap.png",
"09_metal.png",
"10_skin.png",
"11_onetile.png",
"12_barrel.png",
"13_arcade.png",
"14_tentacle.png",
"15_chest.png",
"16_face.png",
};
enum Mode { enum Mode {
Mode_BC1, Mode_BC1,
@ -164,6 +183,8 @@ enum Mode {
Mode_BC1_Normal, Mode_BC1_Normal,
Mode_BC3_Normal, Mode_BC3_Normal,
Mode_BC5_Normal, Mode_BC5_Normal,
Mode_BC5_Normal_Stereographic,
Mode_BC5_Normal_Paraboloid,
Mode_Count Mode_Count
}; };
static const char * s_modeNames[] = { static const char * s_modeNames[] = {
@ -178,6 +199,8 @@ static const char * s_modeNames[] = {
"BC1-Normal", // Mode_BC1_Normal, "BC1-Normal", // Mode_BC1_Normal,
"BC3-Normal", // Mode_BC3_Normal, "BC3-Normal", // Mode_BC3_Normal,
"BC5-Normal", // Mode_BC5_Normal, "BC5-Normal", // Mode_BC5_Normal,
"BC5-Normal-Stereographic", // Mode_BC5_Normal_Stereographic,
"BC5-Normal-Paraboloid", // Mode_BC5_Normal_Paraboloid,
}; };
nvStaticCheck(NV_ARRAY_SIZE(s_modeNames) == Mode_Count); nvStaticCheck(NV_ARRAY_SIZE(s_modeNames) == Mode_Count);
@ -189,7 +212,8 @@ struct Test {
static Test s_imageTests[] = { static Test s_imageTests[] = {
{"Color", 3, {Mode_BC1, Mode_BC3_YCoCg, Mode_BC3_RGBM, Mode_BC3_LUVW}}, {"Color", 3, {Mode_BC1, Mode_BC3_YCoCg, Mode_BC3_RGBM, Mode_BC3_LUVW}},
{"Alpha", 3, {Mode_BC1_Alpha, Mode_BC2_Alpha, Mode_BC3_Alpha}}, {"Alpha", 3, {Mode_BC1_Alpha, Mode_BC2_Alpha, Mode_BC3_Alpha}},
{"Normal", 3, {Mode_BC1_Normal, Mode_BC3_Normal, Mode_BC5_Normal}}, //{"Normal", 3, {Mode_BC1_Normal, Mode_BC3_Normal, Mode_BC5_Normal}},
{"Normal", 3, {Mode_BC5_Normal, Mode_BC5_Normal_Stereographic, Mode_BC5_Normal_Paraboloid}},
{"Lightmap", 4, {Mode_BC1, Mode_BC3_YCoCg, Mode_BC3_RGBM, Mode_BC3_RGBS}}, {"Lightmap", 4, {Mode_BC1, Mode_BC3_YCoCg, Mode_BC3_RGBM, Mode_BC3_RGBS}},
}; };
const int s_imageTestCount = ARRAY_SIZE(s_imageTests); const int s_imageTestCount = ARRAY_SIZE(s_imageTests);
@ -218,6 +242,7 @@ static ImageSet s_imageSets[] = {
{"Quake3", "quake3", s_quake3ImageSet, ARRAY_SIZE(s_quake3ImageSet), ImageType_RGBA}, // 5 {"Quake3", "quake3", s_quake3ImageSet, ARRAY_SIZE(s_quake3ImageSet), ImageType_RGBA}, // 5
{"Witness", "witness", s_witnessImageSet, ARRAY_SIZE(s_witnessImageSet), ImageType_RGB}, // 6 {"Witness", "witness", s_witnessImageSet, ARRAY_SIZE(s_witnessImageSet), ImageType_RGB}, // 6
{"Lightmap", "lightmap", s_witnessLmapImageSet, ARRAY_SIZE(s_witnessLmapImageSet), ImageType_HDR}, // 7 {"Lightmap", "lightmap", s_witnessLmapImageSet, ARRAY_SIZE(s_witnessLmapImageSet), ImageType_HDR}, // 7
{"Normal", "id_tnmap", s_normalMapImageSet, ARRAY_SIZE(s_normalMapImageSet), ImageType_Normal}, // 8
}; };
const int s_imageSetCount = sizeof(s_imageSets)/sizeof(s_imageSets[0]); const int s_imageSetCount = sizeof(s_imageSets)/sizeof(s_imageSets[0]);
@ -431,8 +456,8 @@ int main(int argc, char *argv[])
//TextWriter csvWriter(&csvStream); //TextWriter csvWriter(&csvStream);
Path graphFileName; Path graphFileName;
graphFileName.format("%s/chart_%s_CIE-Lab.txt", outPath, test.name); //graphFileName.format("%s/chart_%s_CIE-Lab.txt", outPath, test.name);
//graphFileName.format("%s/chart_%s_RMSE.txt", outPath, test.name); graphFileName.format("%s/chart_%s_RMSE.txt", outPath, test.name);
StdOutputStream graphStream(graphFileName.str()); StdOutputStream graphStream(graphFileName.str());
TextWriter graphWriter(&graphStream); TextWriter graphWriter(&graphStream);
@ -512,7 +537,7 @@ int main(int argc, char *argv[])
{ {
float totalTime = 0; float totalTime = 0;
float totalRMSE = 0; float totalRMSE = 0;
float totalDeltaE = 0; //float totalDeltaE = 0;
Mode mode = test.modes[t]; Mode mode = test.modes[t];
@ -627,6 +652,15 @@ int main(int argc, char *argv[])
tmp.swizzle(0, 3, 1, 4); // Co Cg 1 Y -> Co Y Cg 1 tmp.swizzle(0, 3, 1, 4); // Co Cg 1 Y -> Co Y Cg 1
tmp.copyChannel(img, 3); // Restore alpha channel for weighting.*/ tmp.copyChannel(img, 3); // Restore alpha channel for weighting.*/
} }
else if (mode == Mode_BC5_Normal) {
tmp.transformNormals(nvtt::NormalTransform_Orthographic);
}
else if (mode == Mode_BC5_Normal_Stereographic) {
tmp.transformNormals(nvtt::NormalTransform_Stereographic);
}
else if (mode == Mode_BC5_Normal_Paraboloid) {
tmp.transformNormals(nvtt::NormalTransform_Paraboloid);
}
printf("Compressing: \t'%s'\n", set.fileNames[i]); printf("Compressing: \t'%s'\n", set.fileNames[i]);
@ -692,6 +726,15 @@ int main(int argc, char *argv[])
img_out.scaleBias(1, 1.0, -0.5); img_out.scaleBias(1, 1.0, -0.5);
img_out.fromYCoCg();*/ img_out.fromYCoCg();*/
} }
else if (mode == Mode_BC5_Normal) {
img_out.reconstructNormals(nvtt::NormalTransform_Orthographic);
}
else if (mode == Mode_BC5_Normal_Stereographic) {
img_out.reconstructNormals(nvtt::NormalTransform_Stereographic);
}
else if (mode == Mode_BC5_Normal_Paraboloid) {
img_out.reconstructNormals(nvtt::NormalTransform_Paraboloid);
}
nvtt::TexImage diff = nvtt::diff(img, img_out, 1.0f); nvtt::TexImage diff = nvtt::diff(img, img_out, 1.0f);
@ -764,9 +807,9 @@ int main(int argc, char *argv[])
totalRMSE += rmse; totalRMSE += rmse;
printf(" RMSE: \t%.4f\n", rmse); printf(" RMSE: \t%.4f\n", rmse);
float deltae = nvtt::cieLabError(img, img_out); //float deltae = nvtt::cieLabError(img, img_out);
totalDeltaE += deltae; //totalDeltaE += deltae;
printf(" CIE-Lab DeltaE:\t%.4f\n", deltae); //printf(" CIE-Lab DeltaE:\t%.4f\n", deltae);
graphWriter << rmse; graphWriter << rmse;
@ -823,13 +866,13 @@ int main(int argc, char *argv[])
} }
totalRMSE /= set.fileCount; totalRMSE /= set.fileCount;
totalDeltaE /= set.fileCount; //totalDeltaE /= set.fileCount;
//totalDiff /= set.fileCount; //totalDiff /= set.fileCount;
printf("Total Results:\n"); printf("Total Results:\n");
printf(" Total Time: \t%.3f sec\n", totalTime); printf(" Total Time: \t%.3f sec\n", totalTime);
printf(" Average RMSE: \t%.4f\n", totalRMSE); printf(" Average RMSE: \t%.4f\n", totalRMSE);
printf(" Average CIE-Lab DeltaE:\t%.4f\n", totalDeltaE); //printf(" Average CIE-Lab DeltaE:\t%.4f\n", totalDeltaE);
if (t != test.count-1) graphWriter << "|"; if (t != test.count-1) graphWriter << "|";
} }

Loading…
Cancel
Save