【问题标题】:Simple code to create an OpenGL cubemap from "cross layout" image file从“交叉布局”图像文件创建 OpenGL 立方体贴图的简单代码
【发布时间】:2014-09-18 00:20:58
【问题描述】:

我正在寻找一个简单的C 子例程(在 Linux 中),它接受一个文件名参数并对glTexImage2D 进行 6 次调用以定义一个“立方体贴图”纹理 (GL_TEXTURE_CUBE_MAP)。

我希望能够读取“交叉布局”文件(水平或垂直)或“水平条”文件,因此这需要各种裁剪操作(并且可能需要进行一些旋转以匹配 OpenGL 期望的方向) .

我确定这段代码存在,但我搜索了一下,只找到了片段。

我偶然发现了GEGL / BABL 库。这看起来不错。有点矫枉过正,但它可以从文件中读取(“gegl:load”),裁剪、旋转和 BABL 可以进行各种像素格式操作(以匹配 OpenGL 的GL_RGBGL_RGBA 格式)。

此外,读取“直线”纹理文件并转换为 gnomic 投影可能很有用(我现在使用 MMPS)。

我发现这个 Python “gimpfu” 代码 (http://registry.gimp.org/files/cubemap-to-dds-v0.3.py.txt) 可以从“交叉布局”转换为多图像 DDS 文件,所以这与我想要的类似,但我宁愿没有 Python 代码我的应用程序。 GIMP 在内部使用 GEGL,这就是我使用它的原因。

【问题讨论】:

    标签: opengl texture-mapping texture2d gegl


    【解决方案1】:

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

    仅供参考,有许多立方体贴图图像文件格式。 V-strip 最容易阅读。 “横向交叉”似乎很受欢迎。一般来说,有 {horizo​​ntal, vertical} x {cross, strip, tee}(可能还有更多)。

    我有一些代码可以读取十字、h 条(它使用 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 的顺序和方向,所以这可能是典型的。

    【讨论】:

      猜你喜欢
      • 2018-07-29
      • 2013-10-22
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多