0

ファイル名パラメーターを受け取り、 「キューブマップ」テクスチャーを定義するために をC6 回呼び出す単純なサブルーチン (Linux) を探しています ( )。glTexImage2DGL_TEXTURE_CUBE_MAP

「クロスレイアウト」ファイル(水平または垂直)または「水平ストリップ」ファイルを読み取れるようにしたいので、これにはさまざまなトリミング操作が必要です(おそらく、OpenGLが期待する方向に一致するようにいくつかの回転が必要です)。

このコードが存在することは確かですが、Google で検索したところ、断片しか見つかりませんでした。

私はGEGL / BABL図書館に出くわしました。これは良さそうです。少しやり過ぎですが、ファイル (" gegl:load") から読み取り、トリミング、回転、BABL を実行して、さまざまなピクセル フォーマット操作を実行できます (OpenGLGL_RGBまたはGL_RGBAフォーマットに一致させるため)。

また、「直線的な」テクスチャ ファイルを読み取って、グノミック プロジェクションに変換すると便利な場合があります (現在、これには MMPS を使用しています)。

「クロスレイアウト」からマルチイメージDDSファイルに変換するこのPython「gimpfu」コード(http://registry.gimp.org/files/cubemap-to-dds-v0.3.py.txt )を見つけました、それは私が望むものに似ていますが、アプリに Python コードを入れたくないのです。GIMP は内部で GEGL を使用しているので、それを使用しています。

4

1 に答える 1

0

ええと... 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);

それが私を始めさせます。直線から V ストリップに変換する MMPS スクリプトがありますが、まだ向きをいじっています。ある本が言うように、「各面のテクスチャ座標の向きは直感に反する」。スクリプトを「nona」/PTstitcher (PanoTools の一部) に変換する場合があります。

参考までに、多くのキューブマップ イメージ ファイル形式があります。V ストリップが最も読みやすいです。「ホリゾンタルクロス」が人気のようです。一般に、{水平、垂直} x {クロス、ストリップ、ティー} (およびおそらくそれ以上) があります。

クロス、h ストリップ ( glPixelStorei(GL_UNPACK_ROW_LENGTH_EXT, width0) を使用) を読み取るコードがいくつかありますが、まだ方向を処理していません。GEGL や libpano13 などを使用する必要があります。または、execl を使用して MMPS / nona / ImageMagick を実行する中間ステップをハックすることもできます。おそらくlibpano13は道のりです.rectilinearファイルからオンザフライでキューブマップを生成できました.

乾杯!

更新: 直線的なイメージから v-strip に変換する MMPS bash スクリプトは次のとおりです (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 の順序と向きになっているため、おそらくそれが典型的なものです。

于 2014-09-20T06:58:41.873 に答える