glTexImage2D против gluBuild2DMipmaps

Очень простой код создания текстуры OpenGL:

int width, height;
BYTE * data;
FILE * file;
// open texture data
file = fopen( filename, "rb" );
if ( file == NULL ) return 0;
// allocate buffer
width = 256;
height = 256;
data =(BYTE*) malloc( width * height * 3 );
// read texture data
fread( data, width * height * 3, 1, file );
fclose( file );
glGenTextures( 1, &texture );
glBindTexture( GL_TEXTURE_2D, texture );
//gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width,   height, GL_RGB, GL_UNSIGNED_BYTE, data );
glTexImage2D( GL_TEXTURE_2D,0, GL_RGB, width,   height,0, GL_RGB, GL_UNSIGNED_BYTE, data );
free( data );
return texture;

и рендеринг:

glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, texture );

glPushMatrix();
glRotatef( theta, 0.0f, 0.0f, 1.0f );
glBegin( GL_QUADS );
glTexCoord2d(0.0,0.0); glVertex2d(-1.0,-1.0);
glTexCoord2d(1.0,0.0); glVertex2d(+1.0,-1.0);
glTexCoord2d(1.0,1.0); glVertex2d(+1.0,+1.0);
glTexCoord2d(0.0,1.0); glVertex2d(-1.0,+1.0);
glEnd();
glPopMatrix();

SwapBuffers( hDC );

При использовании glTexImage2D ничего не рисуется, но с gluBuild2DMipmaps работает, я видел результат с gDebugger, текстура создавалась правильно. В чем проблема?


person jalal sadeghi    schedule 22.01.2014    source источник
comment
Весь этот устаревший код режет мне глаза... Решение номер 1, прекратите использовать устаревший функционал...   -  person vallentin    schedule 22.01.2014
comment
Попробуйте сослаться на это.   -  person derpface    schedule 22.01.2014


Ответы (1)


Когда вы используете glTexImage2D (...) в своем коде, вы не создаете полную текстуру MIP-карты. Он создает хранилище и предоставляет данные только для текстуры LOD 0. Если вы используете GL_..._MIPMAP_... в качестве фильтра минимизации, вам необходимо иметь LOD (уровни детализации) для каждого шага разрешения четверти.

Например, для текстуры размером 32x32 требуется log2 32 = 5 extra mipmap LOD, как описано ниже:

LOD 0: 32x32  ( 1 /    1 )  [1024 Texels]
LOD 1: 16x16  ( 1 /    4 )  [ 256 Texels]
LOD 2: 8x8    ( 1 /   16 )  [  64 Texels]
LOD 3: 4x4    ( 1 /   64 )  [  16 Texels]
LOD 4: 2x2    ( 1 /  256 )  [   4 Texels]
LOD 5: 1x1    ( 1 / 1024 )  [   1 Texel ]

gluBuild2DMipmaps (...) делает несколько вещей:

  1. Он строит набор MIP-карт LOD с четвертным разрешением (отсюда и название).
  2. Он правильно устанавливает количество LOD в вашей текстуре.

    • Default LOD level range in an OpenGL Texture: 1001                    (min = 0, max = 1000)
    • После gluBuild2DMipmaps (...): log2 (макс. (Resx, Resy)) + 1 (min = 0, макс = ...).

Это создает полную текстуру MIP-карты, которую можно использовать с фильтром минимизации MIP-карты.


Разное, на что следует обратить внимание:

Фильтр минимизации по умолчанию в OpenGL: GL_NEAREST_MIPMAP_LINEAR, поэтому вам нужна полная текстура mipmap, если вы не измените ее на GL_LINEAR или GL_NEAREST.

Индексы LOD в OpenGL работают несколько нелогично. Меньшие числа представляют изображения с более высоким разрешением, и поэтому использование отрицательного смещения LOD иногда называют «повышением резкости текстуры».

Геометрический ряд: 1 + 1/4 + 1/16 + 1< /sup>/64 + ... + 1/N сходится к 4/3; MIP-карты требуют ~33% дополнительного места для хранения.

person Andon M. Coleman    schedule 22.01.2014