Мне сложно заставить работать 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. Итак, я не понимаю, как это может быть какой-то другой код - по крайней мере, я не могу придумать что-нибудь еще.
Доступен ли glGenerateMipmap в версии 1.1?
нет - я исследовал это, и я думаю, что это было добавлено в 3.0
Есть ли проблемы, когда вы не пытаетесь создать MIP-карты?
Хех нет! Вот почему это так странно. Фактически, чтобы заставить его работать, я просто меняю GL_NEAREST_MIPMAP_NEAREST на GL_NEAREST, и внезапно он работает, но не использует MIP-карты.
Какое значение имеют MIP-карты и тип данных tex?
беззнаковый длинный int * tex [20]; и mipmaps = 8;
на данный момент в файле нет разницы в данных (при просмотре как void * data) между байтами и длинными целыми числами без знака. Кроме того, это работает, когда я не имею дело с MIP-картами. (p.s. мы должны переместить это в чат?)
давайте продолжим обсуждение в чате