OpenGL单通道可实现多通道

时间:2018-05-03 08:41:55

标签: c++ opengl textures rasterizing

当我光栅化一个字体时,我的代码为我提供了一个纹理可视性通道。目前,我只是将其复制到4个不同的通道,并将其作为纹理发送。现在这个工作,但我想尝试避免在CPU上进行不必要的内存分配和解除分配。

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

位图,现在包含一个2d图形。

看来这个人也有同样的问题:Opengl: Use single channel texture as alpha channel to display text

我现在做同样的事情,我只是将数组大小乘以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

它没有透明度,只有红色分机。难以着色和分机。后面。

而不是必须按照我的意思去做cpu方面的不必要的分配,就像告诉OpenGL一样:“嘿,你只得到一个频道。将它乘以所有4个颜色频道。”

是否有命令?

1 个答案:

答案 0 :(得分:2)

在您的着色器中,只需将r组件广播到所有四个频道,即可:

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

如果您不想修改着色器(也许是因为您需要对4通道纹理使用相同的着色器),那么您可以对纹理应用texture swizzle mask

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

当机制从纹理的第四个组件读取时,它们将获得由该纹理的红色组件定义的值。