具有alpha值的OpenGL纹理四边形的行为(字体字形剪切或屏蔽)

时间:2013-09-13 18:23:20

标签: opengl textures alpha

我认为我没有任何语法错误,只是了解alpha的问题 使用OpenGL在纹理四边形上完成。 (mesa 9.0 under centos 6.3,这是我认为的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'):

Without glColor

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

With glColor

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

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

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

我真正在做的是尝试将我预加载的字形作为纹理进行遮罩或剪裁,因此其他方法也会受到欢迎(尽管可能不是过度字体,因为我在某些时候需要复杂的unicode字形) )

1 个答案:

答案 0 :(得分:0)

我会关闭这个,因为我在外面画了一个解决方法 OpenGL然后上传整个纹理。不是我的意思 想要,但现在会工作。