OpenGLES 1.1, сжатие текстур ETC1 и Mipmaping (полный набор ошибок MIPMAP) - PullRequest
0 голосов
/ 18 августа 2011

Когда я активирую мипмапинг на несжатой текстуре, все работает отлично.

Когда я делаю это на текстуре ETC1, текстура пуста, конечно, потому что не был предоставлен полный набор мипмапов.

Код очень прост и работает на iPhone (со сжатием PVR, конечно).

Это не работает на Android. Мип-карта была построена с помощью внешнего инструмента и объединена.

Я прекращаю делать mipmap размером 4, потому что glCompressedTexImage2D возвращает ошибку opengl, если попытаться использовать mipmap ниже.

for(u32 i=0; i<=levels; i++)
{
    size = KC_TexByte(pagex, pagey, tex_type);
    glCompressedTexImage2D(GL_TEXTURE_2D, i, type, pagex, pagey, 0, size, ptr);

    pagex = MAX(pagex/2, 4);
    pagey = MAX(pagey/2, 4); 
    ptr += size;    

    KC_Error();    // test openGL error
}           

Ответы [ 3 ]

2 голосов
/ 16 сентября 2011

Причина, по которой ваша текстура пуста, заключается в том, что требуется, чтобы mipmap прошел весь путь до 1x1.

Я мог бы представить, что ошибка, которую вы получаете с небольшими сжатыми текстурами, заключается в том, что формат текстуры выВы пытаетесь использовать (etc1?) не поддерживает эти размеры.Вам придется использовать несжатые изображения в этих небольших размерах ...

1 голос
/ 19 сентября 2011

Спасибо, но ваше решение не правильное; Я нашел другое решение.

  1. вы правы, когда объясняете, что все mipmap требуются, до размера 1x1
  2. вы не правы, у нас не может быть другого формата между mipmap

Правильный путь:

  1. используя размер до 1x1
  2. имейте в виду, что это сжатые данные с помощью блока, поэтому размер в BYTE не делится на 4 на каждом шаге. после 8x8 размер остается неизменным.

    sx = size in X
    sy = size in Y
    
    byte = ((sx+3)/4)*((sy+3)/4) * 8 * 2;       // 8 = bit per pixel
    
0 голосов
/ 03 апреля 2013
for(u32 i=0; i<=levels; i++)

Кажется, вы бы хотели i < levels вместо <=.

...