В фрагментном шейдере GLSL, как получить доступ к текселю на определенном уровне MIP-карты?

Я использую OpenGL для выполнения некоторых вычислений GPGPU посредством комбинации одного вершинного шейдера и одного фрагментного шейдера. Мне нужно провести вычисления с изображением в разном масштабе. Я хотел бы использовать MIP-карты, поскольку их создание может быть автоматическим и аппаратно ускоренным. Однако мне не удается получить доступ к текстурам mipmap во фрагментном шейдере.

Я включил автоматическое создание mipmap: glTexParameteri (GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

Я безуспешно пытался использовать texture2DLod в шейдере, он просто продолжал давать нормальную текстуру. Я также пробовал использовать glTextureParameteri (GL_BASE_LEVEL, X) в основной программе, и это ничего не меняло.

Как бы Вы это сделали?

Я использую Linux. Моя графическая карта - это довольно старая Nvidia Quadro. Вот мой вывод glxinfo со всеми поддерживаемыми расширениями.


person Jim    schedule 03.09.2010    source источник
comment
Я поддерживаю ваш вопрос, потому что он полезен и понятен, но, похоже, вы все делаете правильно. Что говорит glTextureSize (sampler, lod)? (В вашем фрагментном шейдере)   -  person Calvin1602    schedule 03.09.2010
comment
Мне такая функция недоступна. Я думаю, что моя карта слишком старая (я только что проверил, а версия GLSL - GL_ARB_shading_language_100). Это многое объяснило бы, но я не понимаю, почему шейдер примет вариант * Lod без жалоб, если он не поддерживается ...   -  person Jim    schedule 06.09.2010
comment
Я также не понимаю, почему вызовы glTextureParameteri (GL_BASE_LEVEL, X) и glTextureParameteri (GL_MAX_LEVEL, X) тоже не действуют. Это не связано с GLSL ... Я сейчас очень запутался.   -  person Jim    schedule 06.09.2010
comment
У меня есть новости. Я установил glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST) ​​и glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST_MIPMAP_NEAREST вернет 1.0, теперь все вызовы текстуры 1.0, поисковые запросы текстуры 1.0, теперь поисковые запросы IpMAP_NEAREST) моя графическая карта, и мне все еще кажется странным, что она не жаловалась. Однако теперь glTextureParameteri (GL_BASE / MAX_LEVEL, X), похоже, работает.   -  person Jim    schedule 06.09.2010
comment
И последнее: из связанного раздела я прочитал stackoverflow.com/questions/3071006/. Затем я попробовал структуру texture2D (сэмплер, координата, смещение) и смог получить доступ к желаемому уровню MIP-карты во фрагментном шейдере. Думаю, моя проблема решена, но меня удивляет отсутствие ошибок времени выполнения при попытке использовать неподдерживаемые функции ... Или, может быть, я что-то сделал не так :).   -  person Jim    schedule 06.09.2010


Ответы (3)


gvec4 textureLod (gsampler1D sampler, float P, float lod)
gvec4 textureLod (gsampler2D sampler, vec2 P, float lod)
gvec4 textureLod (gsampler3D sampler, vec3 P, float lod)
gvec4 textureLod (gsamplerCube sampler, vec3 P, float lod)
float textureLod (sampler1DShadow sampler, vec3 P, float lod)
float textureLod (sampler2DShadow sampler, vec3 P, float lod)
gvec4 textureLod (gsampler1DArray sampler, vec2 P, float lod)
gvec4 textureLod (gsampler2DArray sampler, vec3 P, float lod)
float textureLod (sampler1DArrayShadow sampler, vec3 P, float lod)

Вы пробовали один из этих встроенных? Также lod должен быть плавающим. Какие ошибки / предупреждения сообщает компилятор GLSL?

person Stringer    schedule 03.09.2010
comment
Привет, извините за долгую задержку. Я попробовал функцию texture2DLod. Странно то, что независимо от того, какое значение я даю lod, возвращаемое значение точно такое же, как и при стандартном поиске texture2D. При компиляции шейдера ошибок и даже предупреждений не возникает. - person Jim; 06.09.2010

Спецификация GLSL 1.20 (раздел 8.7) утверждает, что шейдеры фрагментов не могут выбирать свой собственный уровень MIP-карты (и что функция текстуры * Lod доступна только в вершинных шейдерах). Во всяком случае, вы можете использовать параметр bias для вариантов, отличных от Lod, чтобы изменить уровень mipmap, но он может изменить его только относительно того, что карта уже рассчитала для вас.

Я не знаю, могли ли последние версии GLSL это изменить.

person Dolda2000    schedule 29.09.2011
comment
На самом деле они изменили это, как показал самый первый ответ на этот вопрос. - person Christian Rau; 18.08.2012

пытаться:

glGenerateMipmapEXT(GL_TEXTURE_2D);

после привязки текстуры. (И, конечно, перед рендерингом)

glTexParameteri-GL_GENERATE_MIPMAP устарел, я думаю ... MfG Digi

person Digi    schedule 30.11.2010