OpenGL 3.3, GLSL 1.5: Как настроить объект текстуры буфера, содержащий различные texture2D? - PullRequest
2 голосов
/ 09 декабря 2010

Мне было интересно, возможно ли иметь массив sampler2D в вершинном шейдере GLSL 1.5.

Мне нужно получить доступ к 30 различным 2d-текстурам из моего вершинного шейдера. Я читал, что невозможно иметь такую ​​структуру, как:

uniform sampler2d texture[30];

Тем не менее, наличие 30 различных униформ несколько преувеличено и довольно сложно управлять ...

Итак, это привело меня к мысли о наличии объекта текстурного буфера. TBO поддерживаются начиная с OpenGL 3.0. Однако я не смог найти хороший учебник или пример, соответственно, который показывает, как инициализировать TBO не только одной текстурой, но и несколькими текстурами.

Этот веб-сайт показывает пример того, как инициализировать TBO с одной текстурой. Ничего страшного. Я думаю, что самый важный метод

void createTBO(GLuint* tbo, GLuint* tex)

Выполнив метод

glTexBufferEXT(GL_TEXTURE_BUFFER_EXT, GL_RGBA32F_ARB, *tbo);  

можно фактически прикрепить текстуру к буферу. Это также упоминается здесь . Я предполагаю, что вызов glTexBuffer 30 раз один за другим не сработает.

Итак, я подумал, может ли быть другой способ получить тот же результат. Я придумал две идеи:

  • Добавление 30 2d-текстур в 3d-текстуру и прикрепление их непосредственно к вершинному шейдеру. Однако это было бы большой тратой памяти, так как большинство слоев 3d-текстуры не использовалось бы.
  • Использование структуры, называемой sampler2DArray. Это упоминается в спецификации. Однако я искал в Интернете и не смог найти никакой ценной информации о том, как это реализовать.

Итак, мои вопросы:

  • Как настроить TBO, содержащий более 1 текстуры?
  • Это вообще возможно?
  • Знаете ли вы источники, где я мог бы найти информацию о добавлении 2d-текстур в 3d-текстуру?
  • Знаете ли вы сайты, где я мог найти информацию об инициализации, связывании и использовании sampler2DArray?

Я был бы благодарен, если бы вы могли дать мне совет. Я действительно новичок с точки зрения OpenGL.

Спасибо Walter

Ответы [ 3 ]

10 голосов
/ 09 декабря 2010

Полагаю, вы неправильно поняли, что такое объект текстурного буфера (TBO). TBO используется для доступа к объекту буфера внутри шейдера, ничего более. Он не содержит несколько текстур или чего-то в этом роде.

Если текстуры одинакового размера, вы можете использовать 3D-текстуру или массив текстур. ТБО бесполезен для вашей проблемы.

2 голосов
/ 09 декабря 2010

Вы можете использовать форму sampler2DArray. Вы можете использовать их для передачи нескольких текстур в ваш шейдер.

http://www.opengl.org/registry/specs/EXT/texture_array.txt

Альтернативным решением будет использование очень большого ТБО и сохранение всех текстур в ТБО. Текстура может быть размером до 11585x11585 текселей (2 ^ 27)

texture_buffer_object.txt

1 голос
/ 14 апреля 2011

Как предложил Джоцки, используйте одну очень большую текстуру и соответственно корректируйте координаты текстуры.(или: напишите шейдер, который отображает стандартные координаты в нужное место) Это то, что называется текстурный атлас .Я предполагаю, что вы можете найти некоторые реализации, выполнив поиск по термину.

...