glTexSubImage3D (GL_TEXTURE_2D_ARRAY, ...) и GL_TEXTURE_SWIZZLE_RGBA - PullRequest
0 голосов
/ 17 ноября 2018
  • У меня есть массив текстур (~ 512 слоев).
  • Некоторые из загружаемых мной текстур имеют 4 канала (RGBA), некоторые имеют только один (RED).

При создании отдельных текстур я могу сделать следующее:

GLint swizzleMask[] = { GL_ONE, GL_ONE, GL_ONE, GL_RED };
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);

Могу ли я сделать это для определенных слоев моего массива текстур?(Swizzling должен применяться только к одной текстуре в массиве, а не к другим).

Я подозреваю, что это невозможно, и если да, то какой метод предпочтительнее?(Атрибуты вершин были бы моим последним вариантом).

(i) РЕДАКТИРОВАТЬ: предпочтительно искать решение OpenGL 3.3 или ниже.

(ii) РЕДАКТИРОВАТЬ: Идея заключается в том, что у меня есть RGBAрастровые изображения для моей игры (трава, стена и т. д.), и у меня также есть шрифт растровые изображения.Я пытаюсь сделать это во время одного и того же вызова.

В моем фрагментном шейдере у меня есть что-то вроде:

uniform sampler2DArray TextureArraySampler;

out vec4 FragmentColor;
in VertexOut
{
    vec2 UV;
    vec4 COLOR;
    flat uint TEXTURE_INDEX;
} In;

void main(void)
{
    FragmentColor = In.COLOR * texture(TextureArraySampler, vec3(In.UV.x, In.UV.y, In.TEXTURE_INDEX));
}

Итак, при рендеринге шрифтов я бы хотел, чтобы шейдер делал сэмплы, например:

FragmentColor = In.COLOR * vec4(1, 1, 1, texture(TextureArraySampler, vec3(In.UV.x, In.UV.y, In.TEXTURE_INDEX)).r);

И, при рендеринге растровых изображений:

FragmentColor = In.COLOR * texture(TextureArraySampler, vec3(In.UV.x, In.UV.y, In.TEXTURE_INDEX)).rgba;

1 Ответ

0 голосов
/ 17 ноября 2018

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

Я пытаюсь сделать это в одном и том же вызове.

Презентации производительности вокруг OpenGL часто говорят о том, что сокращение вызовов отрисовки является важным аспектом производительности. Это очень верно, особенно для высокопроизводительных приложений.

Это, как говорится , это не означает, что нужно предпринять геркулесовские усилия, чтобы уменьшить количество вызовов на ничью до 1. Суть совета состоит в том, чтобы заставить людей структурировать свои двигатели так, чтобы число вызовов отрисовки не увеличивает со сложностью сцены.

Например, рассмотрите вашу карту тайлов. Выполнение вызовов отрисовки для каждой плитки - это плохо, потому что количество вызовов отрисовки увеличивается линейно с количеством отрисовываемых плиток. Поэтому имеет смысл нарисовать всю карту тайлов за один вызов.

Теперь предположим, что ваша сцена состоит из карт листов и глифов шрифтов, и это всегда будет именно так. Вы можете сделать это за два вызова (один для карт и один для глифов), или вы можете сделать это за один вызов. Но разница в производительности между ними будет незначительной . Важно то, что добавление большего количества плиток / глифов не означает добавление дополнительных вызовов отрисовки.

Так что вам не стоит беспокоиться о добавлении нового вызова в ваш движок. Вас должно беспокоить, если вы добавляете новый вызов отрисовки per-X к вашему движку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...