繁体   English   中英

OpenGL:禁用纹理颜色?

[英]OpenGL: Disable texture colors?

是否可以禁用纹理颜色,并仅使用白色作为颜色? 它仍然会读取纹理,所以我不能使用glDisable(GL_TEXTURE_2D),因为我也想渲染alpha通道。

我现在能想到的就是制作一个所有颜色数据都是白色的新纹理,保持原样的alpha状态。

我需要在没有着色器的情况下这样做,所以这甚至可能吗?

编辑:澄清:我想使用两种纹理:白色和普通颜色。

编辑:显然这是不可能的

我仍然不完全确定我理解你想要什么,但我会试一试。 我的想法是,当你调用glTexImage2D ,你指定你正在加载的纹素的格式, 指定你从那些纹素创建的纹理的“内部格式”。 在典型情况下,您为两者指定(大致)相同的格式 - 例如,您通常会同时使用GL_RGBA

有两个虽然指定一个原因是: format (接近列表的末尾参数)指定你加载纹理像素的格式,但internal format (一接近参数列表的开头)指定从这些纹素中创建的实际纹理的格式。

如果你想加载一些纹素,但实际上只使用它们的alpha通道,你可以为internal format指定GL_ALPHA ,这就是你得到的全部 - 当你将纹理映射到表面时,它只会影响阿尔法,而不是颜色。 这不仅可以避免制作纹素的额外副本,而且(至少通常)也会减少纹理本身消耗的内存,因为它只包含alpha通道,而不包括三个颜色通道。

编辑:好的,考虑一下,有一种方法可以做你想要的(我认为),只使用一个纹理。 首先,设置混合功能,只需使用alpha通道,那么当你要复制的纹理的颜色,你叫glTextureEnvfGL_REPLACE ,但是当你只想使用alpha通道,你叫它GL_BLEND 例如,让我们创建一个绿色纹理,并在蓝色四边形上绘制(两次),一次使用GL_REPLACE,一次使用GL_BLEND。 为简单起见,我们将使用纯绿色纹理,alpha从顶部(0)到底部(1)线性增加:

static GLubyte Image[128][128][4];

for (int i=0; i<128; i++)
    for (int j=0; j<128; j++) {
        Image[i][j][0] = 0;
        Image[i][j][1] = 255;
        Image[i][j][2] = 0;
        Image[i][j][3] = i;
    }

我将跳过大部分创建和绑定纹理,设置参数等,并直接使用纹理绘制几个四边形:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

glBegin(GL_QUADS);
    glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
    glTexCoord2f(0.0, 0.0); glVertex3f(-1.0f, 1.0f, 0.0f);
    glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
    glTexCoord2f(1.0, 0.0); glVertex3f(0.0f, 1.0f, 0.0f);
    glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
    glTexCoord2f(1.0, 1.0); glVertex3f(0.0f, -1.0f, 0.0f);
    glColor4f(0.0, 0.0f, 1.0f, 1.0f);
    glTexCoord2f(0.0, 1.0); glVertex3f(-1.0f, -1.0f, 0.0f);
glEnd();

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);

glBegin(GL_QUADS);
    glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
    glTexCoord2f(0.0, 0.0); glVertex3f(0.0f, 1.0f, 0.0f);
    glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
    glTexCoord2f(1.0, 0.0); glVertex3f(1.0f, 1.0f, 0.0f);
    glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
    glTexCoord2f(1.0, 1.0); glVertex3f(1.0f, -1.0f, 0.0f);
    glColor4f(0.0, 0.0f, 1.0f, 1.0f);
    glTexCoord2f(0.0, 1.0); glVertex3f(0.0f, -1.0f, 0.0f);
glEnd();

这会产生:

混合纹理

因此,在使用GL_REPLACE绘制的左侧,我们得到纹理的绿色,但是在右侧,用GL_BLEND绘制的位置(并且glBlendFunc设置为仅使用alpha通道),我们得到蓝色四边形,但是从纹理中取出的Alpha - 但我们对两者使用完全相同的纹理。

编辑2:如果你确定你确实需要一个全白的纹理,我只需创建一个1像素的纹理,并将GL_TEXTURE_WRAP_S和GL_TEXTURE_WRAP_T设置为GL_REPEAT。 即使这仍然使用额外的纹理,额外的纹理将非常小,因为它只有一个像素。 加载它的时间和消耗的内存都将是真正微不足道的 - 像素的数据基本上是“噪声”。 我没有尝试过测试,但你可能会选择像8x8或16x16像素块这样的东西。 这仍然很小,几乎不重要,但这些分别是JPEG和MPEG中使用的尺寸,我可以看到卡和(特别是)驱动程序可能针对它们进行优化的位置。 它可能会有所帮助,也不会受到伤害(无论如何都要关心)。

在加载之后以及在OpenGL中使用它们之前,将所有纹理颜色(除了alpha)更改为白色怎么样? 如果你在某些时候将它们作为内存中的位图,它应该很容易,你不需要单独的纹理文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM