gpt4 book ai didi

opengl - 在忽略其 alpha channel 的情况下在 OpenGL 中绘制纹理

转载 作者:行者123 更新时间:2023-12-03 10:51:21 24 4
gpt4 key购买 nike

我将一个纹理加载到内存中,它是具有各种 alpha 值的 RGBA 格式。

图像是这样加载的:

 GLuint texture = 0;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
self.texNum = texture;

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, self.imageWidth, self.imageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, [self.imageData bytes]);

我想知道如何绘制此纹理,以便将图像中的 alpha channel 视为全 1,并像 RGB 图像一样绘制纹理。

考虑基本图像:

http://www.ldeo.columbia.edu/~jcoplan/alpha/base.png

此图像是从 0 到 255 alpha 的渐变,并且始终具有 255,0,0 的 RGB 值

但是,如果我在禁用混合的情况下绘制它,我得到的图像如下所示:www.ldeo.columbia.edu/~jcoplan/alpha/no_alpha.png

当我真正想要的是一个看起来像这样的图像时:www.ldeo.columbia.edu/~jcoplan/alpha/correct.png

我非常感谢一些建议让它完全忽略 alpha channel 。请注意,我最初不能只将图像作为 RGB 加载,因为我确实需要在其他点使用 alpha channel 。

编辑:我尝试使用 GL_COMBINE 来解决我的问题:

glColorf(1,1,1,1);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
[self drawTexture];

但仍然没有运气,它仍然把黑色画成红色。

最佳答案

I have a texture loaded into memory that is of RGBA format with various alpha values

glDisable(GL_BLEND)

However if I draw it with blending disabled I get an image that looks like: www.ldeo.columbia.edu/~jcoplan/alpha/no_alpha.png

发生这种情况是因为在您的源图像中所有透明像素都是黑色的。这是您的纹理/图像问题,或者可能是加载程序功能问题,但这不是 OpenGL 问题。

您可能会尝试使用 glTexEnv(GL_COMBINE... ) 来修复它(即将纹理颜色与基于 alpha channel 的基础颜色混合),但由于我没有做过类似的事情,所以我不完全确定,并且不能给你确切的操作数。这在 Direct3D9 中是可能的(使用 D3DTOP_MODULATEALPHA_ADDCOLOR),所以很可能有一种方法可以在 opengl 中实现。

关于opengl - 在忽略其 alpha channel 的情况下在 OpenGL 中绘制纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3205665/

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