我正在寻找一个简单的C
子程序(在Linux中),该子程序接受一个文件名参数并对glTexImage2D
进行6次调用以定义“立方体贴图”纹理(GL_TEXTURE_CUBE_MAP
)
我希望能够读取“交叉布局”文件(水平或垂直)或“水平条带”文件,因此这需要各种裁剪操作(可能还有一些旋转以匹配OpenGL期望的方向)
我确定这段代码存在,但我用Google搜索并发现了碎片。
我偶然发现了GEGL / BABL
个库。这看起来不错。有点矫枉过正,但它可以从文件中读取(“gegl:load
”),裁剪,旋转和BABL可以进行各种像素格式操作(以匹配OpenGL GL_RGB
或GL_RGBA
格式)
此外,阅读“直线”纹理文件并转换为gnomic投影可能很有用(我现在正在使用MMPS)。
我发现这个Python“gimpfu”代码(http://registry.gimp.org/files/cubemap-to-dds-v0.3.py.txt)从“交叉布局”转换为多图像DDS文件,这与我想要的类似,但我宁愿没有Python我的应用中的代码。 GIMP在内部使用GEGL,这就是我使用它的原因。
答案 0 :(得分:0)
嗯......我写了一个非常简单的"垂直条带"使用Freeimage库的cubemap阅读器。这是关键所在:
FIBITMAP *bitmap = FreeImage_Load(FreeImage_GetFileType(name0, 0), name0, BMP_DEFAULT);
FIBITMAP *pImage = FreeImage_ConvertTo32Bits(bitmap);
FreeImage_Unload(bitmap);
int width0=FreeImage_GetWidth(pImage);
int height0=FreeImage_GetHeight(pImage);
void *pixels0 = FreeImage_GetBits(pImage);
// "v-strip" (for simplicity, assume OpenGL order and orientation)
height0 /= 6;
for(int idx0=GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; idx0 >= GL_TEXTURE_CUBE_MAP_POSITIVE_X ; idx0--) { // NB : index goes backwards because image files start at the bottom
glTexImage2D(idx0, 0, GL_RGB, width0, height0,
0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels0);
pixels0 += width0 * height0 * 4; // "4" : sizeof(RGBA pixel) ?
}
glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
FreeImage_Unload(pImage);
这让我开始了。我有一个MMPS脚本,可以从直线转换为v-strip,但我仍然在摆弄方向。正如一本书所说,"每张脸的纹理坐标的方向都是违反直觉的#34;。我可能会将脚本转换为" nona" / PTstitcher(PanoTools的一部分)。
仅供参考,有许多立方体贴图图像文件格式。 V-strip最容易阅读。 "横向交叉"似乎很受欢迎。通常,有{水平,垂直} x {cross,strip,tee}(可能更多)。
我有一些代码可以读取十字架,h-strips(它使用glPixelStorei(GL_UNPACK_ROW_LENGTH_EXT,width0)),但它仍然没有处理方向。我必须使用像GEGL或libpano13这样的东西。或者破解使用execl运行MMPS / nona / ImageMagick的中间步骤。也许libpano13是要走的路:我可以从直线文件中动态生成立方体贴图。
干杯!
更新:这里是MMPS bash脚本,用于从直线图像转换为v-strip(以OpenGL顺序和方向):
## NB : yum install ImageMagick # for convert & montage
infile0=$1
MMPS0=~/mmps-0-1-36
tmp0=/tmp/cube$$
convert $infile0 $tmp0.ppm
ARGS0="gnomonic -grid -gridcolor 255:255:255 -scale 2 -w 512 -h 512"
ARGS0="gnomonic -scale 2 -w 512 -h 512"
#
$MMPS0/project $ARGS0 -lat 0 -long 0 -f $tmp0.ppm -rotate -90 > $tmp0-xp.ppm & ## africa
$MMPS0/project $ARGS0 -lat 0 -long 180 -f $tmp0.ppm -rotate 90 > $tmp0-xn.ppm & ## pacific ocean
$MMPS0/project $ARGS0 -lat 0 -long 90 -f $tmp0.ppm -rotate 180 > $tmp0-yp.ppm & ## indian ocean
$MMPS0/project $ARGS0 -lat 0 -long 270 -f $tmp0.ppm -rotate 0 > $tmp0-yn.ppm & ## americas
$MMPS0/project $ARGS0 -lat 90 -long 0 -f $tmp0.ppm -rotate -90 > $tmp0-zp.ppm & ## north pole
$MMPS0/project $ARGS0 -lat -90 -long 0 -f $tmp0.ppm -rotate -90 > $tmp0-zn.ppm & ## south pole
wait
montage $tmp0-xp.ppm $tmp0-xn.ppm \
$tmp0-yn.ppm $tmp0-yp.ppm \
$tmp0-zp.ppm $tmp0-zn.ppm \
-mode Concatenate -tile 1x6 cube-vstrip-ogl.jpg
##$tmp0-yp.ppm $tmp0-yn.ppm \ ##### swap 'em ??? had to reverse
# also, for textures viewed from the "outside" (eg : earth texture on sphere, swap y in frag shader:
# gl_FragColor = textureCube(cubemap2, vec3(texCoord0.x, -texCoord0.y, texCoord0.z));
rm $tmp0-*
仅供参考,我发现了一些测试图像(https://www.terathon.com/wiki/index.php/Importing_a_Texture),并且v-strip是OpenGL的顺序和方向,所以也许这是典型的。