Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL:禁用纹理颜色?_C++_Opengl_Texture Mapping - Fatal编程技术网

C++ OpenGL:禁用纹理颜色?

C++ OpenGL:禁用纹理颜色?,c++,opengl,texture-mapping,C++,Opengl,Texture Mapping,是否可以禁用纹理颜色,并仅使用白色作为颜色?它仍然会读取纹理,所以我不能使用glDisable(GL_texture_2D),因为我也想渲染alpha通道 我现在能想到的就是制作新的纹理,其中所有颜色数据都是白色的,保持alpha原样 我需要在没有着色器的情况下执行此,所以这可能吗 编辑:澄清一下:我想同时使用两种纹理:白色和普通颜色 编辑:显然这是不可能的在加载所有纹理颜色(alpha除外)并在OpenGL中使用之前,如何将它们更改为白色?如果您在某个时候将它们作为位图存储在内存中,这应该很容

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

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

我需要在没有着色器的情况下执行此,所以这可能吗

编辑:澄清一下:我想同时使用两种纹理:白色和普通颜色


编辑:显然这是不可能的

在加载所有纹理颜色(alpha除外)并在OpenGL中使用之前,如何将它们更改为白色?如果您在某个时候将它们作为位图存储在内存中,这应该很容易,而且您不需要单独的纹理文件。

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

但指定这两种格式是有原因的:
格式(靠近列表末尾的参数)指定从中加载的纹理的格式,而
内部格式(靠近参数列表开头的格式)指定从这些纹理创建的实际纹理的格式

如果您想加载一些纹理,但实际上只使用它们的alpha通道,可以为
内部格式
指定
GL_alpha
,这就是您所能得到的——当您将纹理映射到曲面时,它只会影响alpha,而不会影响颜色。这不仅避免了额外复制纹理,而且(至少通常)还减少了纹理本身所消耗的内存,因为它只包括一个alpha通道,而不是三个颜色通道

编辑:好的,再仔细想想,有一种方法可以做你想做的事情,只使用一种纹理。首先,将混合函数设置为仅使用alpha通道,然后当您要复制纹理的颜色时,可以使用
GL\u REPLACE
调用
glTextureEnvf
,但当您只想使用alpha通道时,可以使用
GL\u混合
调用它。例如,让我们创建一个绿色纹理,并在蓝色四边形上绘制(两次),一次使用GL_替换,一次使用GL_混合。为简单起见,我们将使用实心绿色纹理,alpha从顶部(0)到底部(1)线性增加:

这将产生:

因此,在左边用GL_替换绘制的地方,我们得到了纹理的绿色,但在右边,用GL_混合绘制的地方(glBlendFunc被设置为仅使用alpha通道),我们得到了蓝色的四边形,但它的alpha取自纹理——但我们对两者使用完全相同的纹理


编辑2:如果你决定你真的需要一个全白色的纹理,我只需要创建一个1像素的纹理,并将GL_texture_WRAP_s和GL_texture_WRAP_T设置为GL_REPEAT。即使这仍然使用一个额外的纹理,这个额外的纹理将非常小,因为它只有一个像素。加载它的时间和消耗的内存都非常小——像素的数据基本上是“噪声”。我还没有尝试过测试,但您最好使用8x8或16x16像素块。这仍然很小,几乎不重要,但这些是JPEG和MPEG中分别使用的大小,我可以看到卡和(特别是)驱动程序可能会针对它们进行优化。这可能会有帮助,也不会造成伤害(不管怎样,这都足以让你在意)。

你想达到什么目的?为什么按照你的建议制作一个新的纹理不是一个好的解决方案?因为加载速度会变慢,占用的内存会增加一倍,我想找一个更好的方法,因为我不知道有没有更好的方法。只是为了进一步澄清一下,你试图完成的是(部分时间,不总是)忽略颜色,只使用纹理的alpha通道,对吗?是的,除了我必须看到它是白色(或任何带有glColor4f()的颜色)功能我刚刚测试了发布在这里的解决方案:它是有效的!但是我也需要使用纹理。我想要一个选项来显示它为白色。@新手,复制一份纹理。这会占用两倍的内存,我知道你正在努力避免,但至少你只需要从磁盘加载一份,而且它是干的。我不明白我该怎么做运行时仅ad alpha通道,代码pls.im使用代码glBindTexture(GL_TEXTURE_2D,tex);要绑定纹理,我还需要什么只读alpha?im使用glTexImage2D(目标,0,格式,宽度,高度,0,格式,GL_无符号字节,像素);在GPU上保存纹理。这不能在运行时使用,我无法将此函数加倍,否则会创建另一个纹理。如何将GL_纹理_环境_模式恢复到更改前的状态?还有一个问题,我必须在有和没有GL_混合的情况下都能使用此功能,在没有alpha的情况下,我可以看到白色,而使用alpha。才能获得ba对于GL_REPLACE,你可以用
GL_REPLACE
再次调用
glTexEnvf
。我想我不明白你想要的其他内容,所以我无法真正回答。如果你只想要一个白色块,而不使用纹理中的颜色或alpha,为什么要使用纹理呢?那只是一个颜色设置为白色的GL_四边形…啊,你是对的t、 我将为这些设置禁用GL_TEXTURE_2D。我将看看是否可以使用其他代码。通过还原GL_TEXTURE_ENV_模式,我的意思是如何将其设置回编辑之前的状态,以便正常渲染场景的其余部分。您的“edit2”没有意义,我正在使用alpha通道创建形状,如果我删除alpha通道,我将丢失精灵的所有形状。
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();