代码之家  ›  专栏  ›  技术社区  ›  Steven Venham

OpenGL单通道到多通道的可行性

  •  0
  • Steven Venham  · 技术社区  · 6 年前

    当我光栅化字体时,我的代码为纹理提供了一个可视性通道。目前,我只是将其复制到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

    它没有透明度,只有红色外景,很难在以后着色和外景。

    而不是像告诉OpenGL那样在cpu端进行不必要的分配:“嘿,你只得到一个通道。将它乘以所有4个颜色通道。”

    有命令吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Nicol Bolas    6 年前

    在着色器中,只需广播 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);
    

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