Войти
ПрограммированиеФорумГрафика

Bindless textures

Страницы: 1 2 Следующая »
#0
(Правка: 17:15) 17:15, 10 апр. 2019

Начал изучать сей вопрос, и вылезли забавные нюансы.
Как я понял, нельзя делать все текстуры резидентными при загрузке? Мы только генерим хендл, привязанный к текстуре (sampler object я не использую, мне пока так удобнее), у меня на выводе замодденный ку2, как многие тут знают. Разных пассов там хватает (тяжкое наследие Кармака)) ). Делаем резидентами только те,  что на нужны при данной отрисовке? Это уже понятно. А потом после рисования пасса их анрезидент?


#1
20:51, 10 апр. 2019

barnes
> и вылезли

ты путаешь sparse и bindless ?

#2
21:00, 10 апр. 2019

innuendo
Кхм, я конечно бываю туповат)) С кем не бывает)
Но я сейчас о биндлесс текстурах. Причем без отдельного семплера (все по старинке текстура+семплер, мне пока так удобнее)

#3
22:15, 10 апр. 2019

barnes

конкретизируйся

#4
6:40, 11 апр. 2019

AZDO GDC 2014 к просмотру!
Там товарищи прямо говорили, что резидентить и ан рещидентить текстуры каждый кадр - дурной вкус, который мало чего даст.

#5
(Правка: 14:04) 14:03, 11 апр. 2019

innuendo
> конкретизируйся

1 - загружаем текстуры и генерим хэндл

    image->handle = glGetTextureHandleARB(image->texnum);
    glMakeTextureHandleResidentARB(image->handle);
тут все окей, хэндлы создаются

теперь отрисовка
было

GL_MBind    (GL_TEXTURE0, image->texnum);
в шейдере определялось как
layout (binding = 0) uniform sampler2D    u_Diffuse;
glGetUniformLocation я не использую)
Все спокойно работало.
Переделал на биндлесс
glUniformHandleui64ARB(0, image->handle);
#extension GL_ARB_bindless_texture : enable
layout (bindless_sampler, binding  = 0) uniform sampler2D    u_Diffuse;

На выходе получаем матюки

GL_DEBUG: OpenGL Error
Severity 'High': 'glUniformHandleui64ARB has failed to set the uniform at
location '0': the uniform's type, component size, or matrix dimensions are
incompatible with the function variant (GL_INVALID_OPERATION)'
ID: '2269'

#6
14:27, 11 апр. 2019
layout (binding = 0) uniform sampler2D    u_Diffuse;
Какое отношение sampler2D для обычных текстур относится к bindless textures?
Они имеют другой тип, uvec2 (конструктор sampler2D может взять uvec2 как аргумент).
#7
14:30, 11 апр. 2019

Это пример того как было изначально. Это не биндлесс еще

#8
15:59, 11 апр. 2019

У биндлес текстур ограничений никаких нет, можно хоть все текстуры сделать резидентными (я так и делаю). Необходимости в анрезидент нет, только если собираешься выгружать текстуру или поменять семплер.

По коду - вроде все правильно, но я с bindless_sampler лайаутом не пробовал, обычно в качестве типа юзаю "uvec2" с приведением к sampler2D: FragColor = texture(sampler2D(tex), tc.xy);

#9
16:04, 11 апр. 2019

Я про glGetTextureHandleARB не слыхал, но у меня так: генерирую Texture ID, гружу текстуру и генерирую Sampler.
При выводе использую glActiveTexture(), glBindTexture() и glBindSampler(), а в шейдере уже ловлю layout (binding = 0) uniform sampler2D бла-бла-бла...
И всё работает как швейцарские часы!

#10
16:08, 11 апр. 2019

Нашел пример, там с лейаутами сделано так
в шейдере

layout (bindless_sampler, location = 20) uniform sampler2D tex1;
layout (bindless_sampler, location = 25) uniform sampler2D tex2;

а в коде

    /* then connect samplers (location = 20 and 25) in fragment shader to handles */
    glProgramUniformHandleui64ARB(program, 20, handle_texture1);
    glProgramUniformHandleui64ARB(program, 25, handle_texture2);
В общем то логично, о этом гл_дебаг мне и верещал.
Сделал как в примере. Снова куча мата, причем не на  glUniformHandleui64ARB, а на различные ф-ции передачи униформов.
GL_DEBUG: OpenGL Error
Severity 'High': 'glUniform1f parameter <location> has specified an invalid value '18': not the location of an active uniform in the default uniform block (GL_INVALID_OPERATION)'
ID: '2268'
Это у амд прикол такой что-ли????

#11
16:10, 11 апр. 2019

Daniil Petrov
> Я про glGetTextureHandleARB не слыхал, но у меня так: генерирую Texture ID,
> гружу текстуру и генерирую Sampler.
> При выводе использую glActiveTexture(), glBindTexture() и glBindSampler(), а в
> шейдере уже ловлю layout (binding = 0) uniform sampler2D бла-бла-бла...
> И всё работает как швейцарские часы!
Семплеры я не использую, а layout (binding или location) да, у меня используется везде.

#12
4:04, 12 апр. 2019

barnes
Я, кстати, так до сих пор и не знаю, зачем юзают сэмплеры :) по-моему же можно биндинги и без него использовать, да?
Зато, если ты их используешь, то вроде нужно использовать везде, вплоть до текстур фреймбуферов, у меня уже была проблема из-за того, что в одном фреймбуфере текстуры были без сэмплеров, долго и упорно не мог понять, в чём дело )))
У меня location тоже везде прописаны для полной совместимости со SPIR-V.

#13
(Правка: 28 июня 2019, 0:14) 23:19, 27 июня 2019

Подниму тему. Нашел заразу, которая мне мешала, но такое поведение я не понимаю.
Генерация хэннлов там все ок. Это и было понятно сразу.
посредством glUniformHandleui64ARB (или с DSA) это кидается в шейдер, который это кушает как

layout (bindless_sampler, location  = ХХХ) uniform samplerХХХ  u_texture;
Проблема оказалась с samplerCube. Он на амд ломает отрисовку (на нв еще не тестировал). Шейдер компилится, но хз как работает. Я его убрал, шейдер рисует как надо. ЧЗХ?
Забыл уточнить, что изначально с разрядностью хендла накосячил, определив его как long int, а не как long long int.  Но хехе дело оказалось именно в кубмапе

#14
1:15, 28 июня 2019

barnes
> layout (bindless_sampler, location = ХХХ) uniform samplerХХХ u_texture;
Чувак, используй ssbo с текстурами, а не бинди их так как ты делаешь, у меня тоже не работает при таком подходе samplerCube, а при использовании этого же samplerCube в ssbo все ок.
Так что не ломай голову.

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика