从“交叉布局”图像文件创建OpenGL立方体映射的简单代码

从“交叉布局”图像文件创建OpenGL立方体映射的简单代码,opengl,texture-mapping,texture2d,gegl,Opengl,Texture Mapping,Texture2d,Gegl,我正在Linux中寻找一个简单的C子程序,它接受一个filename参数,并对glTexImage2D进行6次调用,以定义一个立方体贴图纹理GL_纹理CUBE_贴图 我希望能够水平或垂直地读取交叉布局文件或水平条带文件,因此这需要各种裁剪操作,可能还需要一些旋转来匹配OpenGL期望的方向 我肯定这段代码是存在的,但我在谷歌搜索了一下,只找到了片段 我偶然发现了GEGL/BABL库。这看起来不错。有点夸张,但它可以从文件中读取gegl:加载、裁剪、旋转和BABL可以执行各种像素格式操作,以匹配O

我正在Linux中寻找一个简单的C子程序,它接受一个filename参数,并对glTexImage2D进行6次调用,以定义一个立方体贴图纹理GL_纹理CUBE_贴图

我希望能够水平或垂直地读取交叉布局文件或水平条带文件,因此这需要各种裁剪操作,可能还需要一些旋转来匹配OpenGL期望的方向

我肯定这段代码是存在的,但我在谷歌搜索了一下,只找到了片段

我偶然发现了GEGL/BABL库。这看起来不错。有点夸张,但它可以从文件中读取gegl:加载、裁剪、旋转和BABL可以执行各种像素格式操作,以匹配OpenGL GL_RGB或GL_RGBA格式

此外,读取一个直线纹理文件并将其转换为gnomic投影可能会很有用,我现在正在使用MMP进行此操作


我发现这个Python gimpfu代码可以从交叉布局转换为多图像DDS文件,所以这与我想要的类似,但我不希望在我的应用程序中使用Python代码。GIMP在内部使用GEGL,所以我使用它。

嗯。。。我使用Freeimage库编写了一个非常简单的垂直条形立方体映射阅读器。关键是:

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形带,但我仍然在摆弄方向。正如一本书所说,每个面的纹理坐标的方向是违反直觉的。我可能会将脚本转换为PanoTools的nona/PTstitcher部分

仅供参考,有许多cubemap图像文件格式。V形带最容易阅读。横向交叉似乎很流行。一般来说,有{水平、垂直}x{交叉、带状、T形}甚至更多

我有一些代码可以读取交叉,h带,它使用glPixelStoreiGL\u UNPACK\u ROW\u LENGTH\u EXT,width0,但它仍然不处理方向。我必须使用像GEGL或libpano13这样的东西。或者破解一个使用execl运行MMPS/nona/ImageMagick的中间步骤。也许libpano13是一个不错的选择:我可以从直线文件动态生成立方体贴图

干杯

更新:以下是MMPS bash脚本,用于按照OpenGL顺序和方向将直线图像转换为v-strip:

## 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-*
仅供参考,我发现了一些测试图像,v-strip是OpenGL顺序和方向的,所以这可能是典型的