Мипмаппинг в OpenGL

avatar
Codesmith
13 апреля 2013 в 00:03
7601
1
3

Мне сложно заставить работать MIP-карты. Я использую OpenGL 1.1, и у меня нет glu, поэтому я использую следующий код инициации текстуры:

  glGenTextures(1,&texname);
  glBindTexture(GL_TEXTURE_2D,texname);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_NEAREST);
  w=width;h=height;
  for(int i=0;i<mipmaps;i++,w/=2,h/=2)
    glTexImage2D(GL_TEXTURE_2D,i,GL_RGBA8,w,h,0,GL_RGBA,GL_UNSIGNED_BYTE,tex[i]);

Переменные:

// data types:
unsigned long int *tex[20];
int mipmaps, width, height, w, h;
GLuint texname;

tex - это массив, содержащий список массивов пикселей MIP-карты текстуры. MIP-карты обрабатываются правильно (я тестировал их индивидуально). mipmaps - это количество MIP-карт, которые уменьшают исходное изображение до текстуры 1x1 пиксель (исходная текстура имеет размер 256x256, поэтому на данный момент в коде это 8). width и height - размеры исходной текстуры (256x256).

В результате он даже не использует текстуру. Все становится просто серым (серым из-за освещения).

Я что-то забыл? Я проверил эту ссылку и не могу найти никаких конфликтов.

Другие подробности: в целом я включаю GL_DEPTH_TEST, GL_TEXTURE_2D, GL_LIGHTING, GL_CULL_FACE, GL_FOG (и GL_LIGHT0, GL_LIGHT1, которые, вероятно, не имеют значения). Кроме того, я использую реализацию OpenGL в Mesa 3D (Mesa версии 4.0, которая переводится в OpenGL версии 1.3), если это может иметь какое-либо отношение к этому.

РЕДАКТИРОВАТЬ:

Проблема в том, что текстура работает нормально (без использования MIP-карт) в тот момент, когда я меняю GL_NEAREST_MIPMAP_NEAREST на GL_NEAREST. Итак, я не понимаю, как это может быть какой-то другой код - по крайней мере, я не могу придумать что-нибудь еще.

Источник
derpface
13 апреля 2013 в 00:14
0

Доступен ли glGenerateMipmap в версии 1.1?

Codesmith
13 апреля 2013 в 00:15
0

нет - я исследовал это, и я думаю, что это было добавлено в 3.0

derpface
13 апреля 2013 в 00:20
0

Есть ли проблемы, когда вы не пытаетесь создать MIP-карты?

Codesmith
13 апреля 2013 в 00:22
0

Хех нет! Вот почему это так странно. Фактически, чтобы заставить его работать, я просто меняю GL_NEAREST_MIPMAP_NEAREST на GL_NEAREST, и внезапно он работает, но не использует MIP-карты.

derpface
13 апреля 2013 в 00:41
0

Какое значение имеют MIP-карты и тип данных tex?

Codesmith
13 апреля 2013 в 00:44
0

беззнаковый длинный int * tex [20]; и mipmaps = 8;

Codesmith
13 апреля 2013 в 00:53
0

на данный момент в файле нет разницы в данных (при просмотре как void * data) между байтами и длинными целыми числами без знака. Кроме того, это работает, когда я не имею дело с MIP-картами. (p.s. мы должны переместить это в чат?)

derpface
13 апреля 2013 в 00:55
0

давайте продолжим обсуждение в чате

Ответы (1)

avatar
derpface
13 апреля 2013 в 01:53
5

Значение MIPMAP - 8. Размер вашего изображения 256x256. Следовательно, у вас должно быть 9 уровней mipmapping (256,128,64,32,16,8,4,2,1). Если один отсутствует, вы потеряете свою текстуру.