【问题标题】:Behavior of OpenGL textured quads with alpha values (font glyph clipping or masking)具有 alpha 值的 OpenGL 纹理四边形的行为(字体字形裁剪或遮罩)
【发布时间】:2013-09-13 18:23:19
【问题描述】:

我不认为我有任何语法错误,只是理解 alpha 的问题 使用 OpenGL 在纹理四边形上完成。 (centos 6.3下的mesa 9.0,我认为是opengl 4.2)

我有一个使用 glTexImage 上传的字体(我尝试过 GL_ALPHA、GL_RED 和目前的 GL_RGBA)。我相当肯定 alpha 通道设置在字母上,而在背景上取消设置,因为我旋转了像素并手动设置)。

所以,澄清一下,TexImage 在字母像素上包含红色 0xff0000,在背景像素上包含黑色 0x000000,并且 alpha 在红色像素上设置为 0xff,否则为 0x00。

我做到了:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE );

之前

glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 
    face->glyph->bitmap.width, face->glyph->bitmap.rows, 
    0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, new_buffer );

当显示字形时:

glBindTexture(GL_TEXTURE_2D, ascii_textures[100] );

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//glColor4f(0.0f, 0.0f, 0.0f, 0.5f);
// Then draw the box
glBegin(GL_QUADS);
    glTexCoord2i( 0, 0 );           
    glVertex2f( ...                          // bottom left
    glTexCoord2i( 0, 1 );
    glVertex2f( ...                          // top left
    glTexCoord2i( 1, 1 );
    glVertex2f( ...                          // top right
    glTexCoord2i( 1, 0 );
    glVertex2f( ...                         // bottom right
glEnd();

我明白了(我在视频上画了红色的“d”):

如果我取消注释 glColor 行,我会得到:

如果我不使用纹理,我会得到一个半透明的暗盒,所以显然混合是有效的。

看来 OpenGL 是从 glColor4f 语句中提取 alpha 值,而不是从纹理中提取。

无论如何让它看纹理而不是颜色?

我真正要做的是尝试掩盖或剪切我作为纹理预加载的字形,因此欢迎使用其他方法来解决这个问题(尽管可能不是 glut 字体,因为在某些时候我需要复杂的 unicode 字形)

【问题讨论】:

  • 使用glColor(0, 0, 0, 0.5),您不应该收到红色字母——它应该是黑色的。你有启用任何着色器吗?还有其他我们应该注意的模式吗?例如glMaterial 的东西?
  • 作为一个最小的测试用例,您可以在代码中创建一个 4 字节数组并将其作为 1x1 纹理上传。使用{0, 0, 1, 1} 确保您得到正确的订单;你应该得到一个蓝色块。
  • @Thomas:如果纹理环境模式设置为 GL_REPLACE 或 GL_DECAL,那么黑色基色对纹理没有影响。事实上我认为OP已经启用了GL_REPLACE模式。
  • 没有 glMaterial 的东西;现在只是学习着色器。今年之前我最后一次使用opengl是在SGI机器上:0纹理是红色的(让我弄清楚哪个是哪个)。我之前尝试过 GL_DECAL,没有区别(白色背景)。
  • 在任何地方都没有引用 GL_REPLACE。

标签: opengl textures alpha


【解决方案1】:

我将关闭它,因为我通过在 OpenGL然后上传整个纹理。不完全是我 想要,但现在可以使用。

【讨论】:

    猜你喜欢
    • 2020-01-27
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    相关资源
    最近更新 更多