2015-05-29 4 views
0

Я много искал и просто не могу найти что-либо по этой теме. У меня есть Macbook с OpenGL 4.1. Я создаю текстуру с:Mac - Линейная интерполяция не работает

glGenTextures(1, &heightMapTexture); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, heightMapTexture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 13); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT); 
glUniform1i(program1->uniformLocation("heightMap"), 0); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, heightMap.getWidth(), heightMap.getHeight(), 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, heightMap.getData().data()); 
glGenerateMipmap(GL_TEXTURE_2D); 

Это прекрасно работает, но я на самом деле хотел бы использовать GL_LINEAR. Но GL_LINEAR дает мне текстуру со всеми нулями/черными.

Mac просто не поддерживает GL_LINEAR или есть расширение для него? В официальной документации я нашел следующий фрагмент кода:

glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, 
       GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

(https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_texturedata/opengl_texturedata.html)

Но я не могу получить расширение работать.

+0

Вы генерируете mipmaps где-нибудь? GL_LINEAR не ожидает никаких mipmaps, поэтому попробуйте, возможно, удалить все, что связано с mipmap gen (уровни и т. Д.). –

+0

Да, я знаю, что он работает так, как сейчас, и когда я меняю GL_NEAREST на GL_LINEAR, этого больше нет. (Я также проверил без mipmapping) – eclipse

ответ

2

GL_R16UI - целочисленный формат текстуры. OpenGL не поддерживает линейную фильтрацию целочисленных форматов.

Из раздела 8.17 "Texture Полнота" в OpenGL 4.5 спецификации, страница 252:

Используя вышестоящий де определений, текстура является полным, если любой из следующих условий справедливы:
[..] Внутренний формат текстуры является целым числом [..], и либо фильтр увеличения не БЛИЖЕ, либо фильтр минимизации не является ни БЛИЖАЙШИМ, ни NEAREST_MIPMAP_NEAREST.

Чтобы использовать texures с 16-бит на компонент точность, можно попробовать с линейной фильтрацией, вам необходимо использовать нормированный формат как GL_R16, или пройти весь путь к поплавку с GL_R32F.

+0

скоро проверит и подтвердит, спасибо большое! – eclipse

+0

подтвердил, что вы действительно _the_man_! – eclipse

2

Mac определенно поддерживает двухлинейную и трехлинейную фильтрацию в OpenGL - он был частью основной спецификации в течение очень долгого времени. Код вы показали для загрузки текстуры:

glTexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, heightMap.getWidth(), heightMap.getHeight(), 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, heightMap.getData().data()); 

Использует 0 в качестве второго параметра, который соответствует изображению базового уровня (иногда называемой верхней MIPMAP). Вы не показываете какой-либо код для загрузки других возможных уровней mip текстуры, или используете вы используете glGenerateTextureMipmap или glGenerateMipmap. В этом случае поведение не определено в спецификации GL, хотя большую часть времени это просто приводит к выборке черной текстуры. Вероятно, включение GL_LINEAR вызывает выбор этих неопределенных уровней текстуры, в результате чего получается черный образец.

Вы должны либо определить эти уровни текстуры с дополнительными вызовами до glTexImage2D, и/или ограничить параметры текстуры фактическими уровнями мига, которые будут содержать ваши текстуры.

+0

Я использую glGenerateMipmap сразу после glTexImage2D. Я подтвердил, что miplevels правильно загружены в gpu (с текстуройLod()). Я думаю, что вы правы, мне нужно пропустить какую-то инициализацию ... – eclipse

Смежные вопросы