Как я могу получить количество выборок, принадлежащих каждому пикселю внутри шейдера?

#opengl #glsl

#opengl #glsl

Вопрос:

Я пытаюсь прочитать каждую выборку буфера глубины с несколькими выборками как образ хранилища, который только что сгенерирован моим предварительным z-проходом.

Однако передо мной стоят две важные проблемы:

  1. Сколько выборок содержится в каждом пикселе изображения?

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

    Но это число не указано внутри шейдера. Все, что я знаю, это то, что буфер состоит из нескольких выборок по одному Image2DMS prez;

    Поскольку количество выборок для каждого текселя задается динамически, я не могу просто объявить его с помощью макроса, подобного #define SAMPLE_PER_TEXAL 16 .

    Я просмотрел спецификацию glsl4.5 и не нашел ни одного API, который мог бы получить это число. Действительно ли возможно получить это число в шейдере?

  2. Как можно получить доступ к указанному образцу изображения?

    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, … вплоть до количества выборок в изображении.