2014-09-18 6 views
0

Я ищу простую подпрограмму C (в Linux), которая принимает параметр имени файла и делает 6 вызовов glTexImage2D для определения текстуры «cubemap» (GL_TEXTURE_CUBE_MAP).Простой код для создания куба из OpenGL из файла изображения «cross layout»

Я хотел бы иметь возможность читать файл «кросс-макета» (горизонтальный или вертикальный) или файл «Горизонтальная полоска», поэтому для этого требуются различные операции обрезки (и, возможно, некоторые вращаются в соответствии с ориентацией, которую ожидает OpenGL).

Я уверен, что этот код существует, но я разобрался и нашел только фрагменты.

Я наткнулся на библиотеки GEGL/BABL. Это выглядит хорошо. Немного перебор, но он может читать из файла («gegl:load»), обрезать, вращать и BABL может выполнять различные операции с форматом пикселей (в соответствии с форматом OpenGL GL_RGB или GL_RGBA).

Кроме того, было бы полезно прочитать «прямолинейный» файл текстуры и преобразовать в гномические проекции (теперь я использую MMPS).

Я нашел этот код «gimpfu» Python (http://registry.gimp.org/files/cubemap-to-dds-v0.3.py.txt), который преобразуется из «кросс-макета» в файл DDS с несколькими изображениями, так что это похоже на то, что я хочу, но я бы предпочел не иметь код Python в своем приложение. GIMP использует GEGL внутри, поэтому я использую это.

ответ

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); 

Это заставляет меня начать. У меня есть сценарий MMPS, который преобразуется из прямолинейного в v-strip, но я все еще играю с ориентациями. Как говорится в одной книге: «Ориентация текстурных координат каждой грани контр-интуитивно понятна». Я могу преобразовать скрипт в «nona»/PTstitcher (часть PanoTools).

FYI, есть много форматов файлов изображений cubemap. V-образную полосу легче всего читать. «Горизонтальный крест», кажется, популярен. В общем, есть {горизонтальный, вертикальный} x {крест, полоса, тройник} (и, вероятно, больше).

У меня есть код, который читает кресты, h-полосы (он использует glPixelStorei (GL_UNPACK_ROW_LENGTH_EXT, width0)), но он по-прежнему не имеет отношения к ориентациям. Я должен буду использовать что-то вроде GEGL или libpano13. Или, возможно, взломать промежуточный шаг, который использует execl для запуска MMPS/nona/ImageMagick. Может быть, libpano13 - это путь: я могу генерировать кубики «на лету» из прямолинейных файлов.

Cheers!

Обновление: вот Баш скрипт MMPS для преобразования прямолинейного изображения в об-полосе (в порядке 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-* 

FYI, я нашел некоторые тестовые изображения (https://www.terathon.com/wiki/index.php/Importing_a_Texture) и v- полоса находится в порядке и ориентации OpenGL, так что, возможно, это типично.