gpt4 book ai didi

c++ - OpenGL 单 channel 到多 channel 的可行性

转载 作者:行者123 更新时间:2023-11-28 01:34:04 25 4
gpt4 key购买 nike

当我栅格化字体时,我的代码为我提供了纹理可见性的单一 channel 。目前,我只是将其复制到 4 个不同的 channel ,并将其作为纹理发送。现在这可行了,但我想尝试避免在 cpu 上进行不必要的内存分配和取消分配。

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

位图,现在包含二维图形。

看来这家伙也有同样的问题: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

这就是我想要的。

当我只使用单 channel 时:

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 端 id 上进行不必要的分配:“嘿,你只有一个 channel 。将它乘以所有 4 个颜色 channel 。”

有命令吗?

最佳答案

在您的着色器中,只需将 r 组件广播到所有四个 channel 就足够了:

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

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

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

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

关于c++ - OpenGL 单 channel 到多 channel 的可行性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50150620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com