代码之家  ›  专栏  ›  技术社区  ›  mpen

OpenGL alpha值使纹理更白?

  •  5
  • mpen  · 技术社区  · 16 年前

    我正在初始化OpenGL

    glViewport(0, 0, winWidth, winHeight);
    glDisable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glDisable(GL_DEPTH_TEST);
    glClearColor(0, 0, 0, 0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, winWidth, 0, winHeight); // set origin to bottom left corner
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glColor3f(1, 1, 1);
    

    那个被洗掉的斑点图像应该是半透明的。黑色的部分应该是完全透明的。正如你所看到的,它后面有一个图像没有显示出来。

    生成该纹理的代码相当长,因此我将描述我所做的工作。这是一个40*30*4的unsigned char类型的数组。每4个字符设置为128(应该是50%透明,对吧?)。

    然后,我将其传递给此函数,将数据加载到纹理中:

    void Texture::Load(unsigned char* data, GLenum format) {
        glEnable(GL_TEXTURE_2D);
            glBindTexture(GL_TEXTURE_2D, _texID);
            glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, _w, _h, format, GL_UNSIGNED_BYTE, data);
        glDisable(GL_TEXTURE_2D);
    }
    

    glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, _texID);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tw, th, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
    glDisable(GL_TEXTURE_2D);
    

    3 回复  |  直到 10 年前
        1
  •  4
  •   mpen    16 年前

    问题是,虽然我的Load函数是正确的,

    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, _w, _h, GL_RGBA, GL_UNSIGNED_BYTE, data);
    

    我正在将GL_RGB传递给此函数

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tw, th, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
    

    哪个 需要指定正确的字节数(四个)。据我所知,子映像不能使用不同的字节数,尽管我认为 如果字节数相同,请使用不同的格式(即混合 GL_RGB GL_BGA GL_RGB GL_RGBA ).

        2
  •  1
  •   aib    16 年前

    你的场景中有重叠的图元吗?

    您知道您正在调用glColor的3参数版本,该版本将alpha设置为1.0,对吗?

    如果你能发布一个截图,或者以其他方式描述当你用相同的颜色和不同的字母绘制两个图元时会发生什么,这可能会很有帮助。事实上,任何演示该问题的代码都会有所帮助。

    编辑:

    我想使用TexImage GL_RGB (为 内部格式

    GL_BGR 不是此参数的有效值,也许它是在欺骗您的实现使用完整的4字节内部格式?(或2字节,根据 GL_LUMINANCE_ALPHA )或者你是说路过 对于Texture::Load()函数,它应该与传递函数没有什么不同 GL_RGB ?

        3
  •  0
  •   Jason Plank Maksim Kondratyuk    13 年前

    我认为这应该可行,但它假设图像有一个alpha通道。如果你尝试加载一个没有alpha通道的图像,你会遇到异常,或者你的应用程序可能会崩溃。对于非阿尔法通道图像,请使用 GL_RGB GL_RGBA GL_UNSIGNED_BYTE .

    void Texture::Load(unsigned char* data) {
      glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, _texID);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tw, th, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
      glDisable(GL_TEXTURE_2D);
    }