#opengl #glsl
#opengl #glsl
Вопрос:
Я пытаюсь прочитать каждую выборку буфера глубины с несколькими выборками как образ хранилища, который только что сгенерирован моим предварительным z-проходом.
Однако передо мной стоят две важные проблемы:
- Сколько выборок содержится в каждом пикселе изображения?
Конечно, я могу получить это число в приложении, потому что это было то, что я указал, когда ранее создавался буфер глубины с несколькими выборками.
Но это число не указано внутри шейдера. Все, что я знаю, это то, что буфер состоит из нескольких выборок по одному
Image2DMS prez;
Поскольку количество выборок для каждого текселя задается динамически, я не могу просто объявить его с помощью макроса, подобного
#define SAMPLE_PER_TEXAL 16
.Я просмотрел спецификацию glsl4.5 и не нашел ни одного API, который мог бы получить это число. Действительно ли возможно получить это число в шейдере?
- Как можно получить доступ к указанному образцу изображения?
API
loadImage(Image2DMS img, ivec2 P, int sample);
может показаться мне полезным. Однако третий параметрint sample
, который называется «номер выборки» в спецификации, по-прежнему не определен во всей спецификации.
Ответ №1:
OpenGL 4.5 /ARB_shader_texture_image_samples позволяет запрашивать количество выборок в текстуре из GLSL с помощью функции textureSamples
. Вы также можете передать его шейдеру через форму.
При imageLoad
передаче типа сэмплера с несколькими выборками он будет принимать дополнительный целочисленный параметр, который указывает, из какой выборки читать. Таким образом, функция для 2D-текстур с несколькими выборками будет выглядеть следующим образом:
gvec imageLoad(gimage2DMS image, ivec2 P, int sample);
Ответ №2:
Даже если нет функции GLSL, которая могла бы дать вам количество выборок, поскольку вы знаете это на стороне клиента, вы можете просто передать его шейдеру как единый.
По второму вопросу — согласно Вики:
При доступе к текстурам с несколькими выборками функция доступа имеет другой параметр, int, который определяет индекс выборки для чтения или записи.
Так что да, использование loadImage(Image2DMS img, ivec2 P, int sample)
перегрузки должно «просто работать» с sample = 0,1,2, … вплоть до количества выборок в изображении.