Mipmaps + PBO: странные проблемы - PullRequest
1 голос
/ 22 сентября 2010

Я использую PBO для быстрой загрузки текстур в моем приложении. Если я использую видеокарту opengl 3 или лучше, я могу легко создать mipmaps с помощью вызова glGenerateMipmap, и он работает нормально. Но на моей более старой карте opengl 2.1 (radeon x800) эта функция недоступна, поэтому я должен использовать один из двух устаревших методов:

glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w,h, 0,GL_RGBA,GL_UNSIGNED_BYTE, src); 

или

gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA8, w,h, GL_RGBA,GL_UNSIGNED_BYTE, src);

Первый метод не работает даже без PBO, он вводит странные артефакты. Второй, без PBO, создает правильные мипмапы, а с PBO генерирует segfault. Любой может помочь ??

Для полноты я прилагаю код, который я использую для PBO:

uint pixelBuffer;
glGenBuffers(1, &pixelBuffer);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pixelBuffer);
glBufferData(GL_PIXEL_UNPACK_BUFFER, size*4, NULL, GL_STATIC_READ);
char *pixels = (char*)glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
... transfer data
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
... and then I use the buffer to create the texture

PS Если я не пытаюсь сгенерировать мипмапы, загрузка pbo работает на всех моих видеокартах.

1 Ответ

1 голос
/ 13 февраля 2012

Это просто, gluBuild2DMipmaps () ожидает указатель в памяти клиента (потому что это просто функция glu, а не часть драйвера), поэтому он не будет работать с PBO. Что касается использования

glTexParameteri (GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

попробуйте назвать его после glTexImage2D (). Некоторые драйверы реализуют это расширение по-разному и фактически требуют, чтобы эта строка вызывалась каждый раз, когда должны быть сгенерированы mipmaps ( ничего сделано " автоматическое все") Ваши странные артефакты на самом деле являются случайными данными на более высоких уровнях mipmap, потому что mipmaps вообще не были сгенерированы.

Что касается использования PBO для скорости, это совершенно законный метод. Возможно, с «закрепленной памятью» возможен новый способ, но я еще не изучал его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...