OpenGL жизнеспособность одного канала для нескольких каналов - PullRequest
0 голосов
/ 03 мая 2018

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

unsigned char *bitmap = new unsigned char[width*height] //How this is populated is not the point.

растровое изображение, теперь содержит 2-мерную графику.

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

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

unsigned char* colormap = new unsigned char[width * height * 4];
        int offset = 0;
        for (int d = 0; d < width * height;d++)
        {
            for (int i = 0;i < 4;i++)
            {
                colormap[offset++] = bitmap[d];
            }
        }

Когда я умножаю это, я использую:

glTexParameteri(gltype, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(gltype, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(gltype, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, colormap);

И получите:

Want

Что я и хочу.

Когда я использую только один канал:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(gltype, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(gltype, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, bitmap);

и получите:

get

Нет прозрачности, только красный доп. затрудняет раскрашивание и доп. позже.

Вместо того, чтобы делать то, что я чувствую, это ненужные выделения со стороны идентификатора стороны процессора, например, скажем OpenGL: «Эй, вы получаете только один канал. Умножьте его на все 4 цветовых канала».

Есть ли для этого команда?

1 Ответ

0 голосов
/ 03 мая 2018

В вашем шейдере достаточно просто транслировать компонент r на все четыре канала:

vec4 vals = texture(tex, coords).rrrr;

Если вы не хотите изменять свой шейдер (возможно, потому, что вам нужно использовать тот же шейдер и для 4-канальных текстур), тогда вы можете применить текстурную маску изгиба к текстуре:

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

Когда механизмы читают из четвертого компонента текстуры, они получат значение, определенное красным компонентом этой текстуры.

...