- У меня есть массив текстур (~ 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;