В GLSL фрагментен шейдър, как да получите достъп до texel на конкретно ниво на mipmap?

Използвам OpenGL, за да направя някои GPGPU изчисления чрез комбинацията от един вертексен шейдър и един фрагментен шейдър. Трябва да направя изчисления върху изображение в различен мащаб. Бих искал да използвам mipmaps, тъй като тяхното генериране може да бъде автоматично и хардуерно ускорено. Въпреки това не мога да получа достъп до 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) ​​и всички извиквания на texture2DLod се връщат (1.0, 1.0, 1 .0, 1.0)... Предполагам, че търсенето на mipmaps във фрагментни шейдъри определено не се поддържа от моята графична карта и все още мисля, че е странно, че не се оплакваше. Сега обаче glTextureParameteri(GL_BASE/MAX_LEVEL, X) изглежда работи.   -  person Jim    schedule 06.09.2010
comment
Едно последно нещо: от свързания раздел прочетох stackoverflow.com/questions/3071006/. След това изпробвах структурата texture2D(sampler, coord, bias) и имах достъп до желаното ниво на mipmap във фрагментния шейдър. Мисля, че тогава проблемът ми е решен, но съм изненадан от липсата на грешки по време на изпълнение, когато се опитвам да използвам неподдържани функции... Или може би има нещо друго, което съм направил погрешно :).   -  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 трябва да е тип float. Какви грешки/предупреждения отчита GLSL компилаторът?

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

Спецификацията на GLSL 1.20 (раздел 8.7) гласи, че фрагментните шейдъри не могат да избират свое собствено ниво на mipmap (и че функцията texture*Lod е налична само във върховите шейдъри). Ако не друго, може да сте в състояние да използвате параметъра за отклонение към вариантите, които не са 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