低 OpenGL Alpha 值裁剪

Posted

技术标签:

【中文标题】低 OpenGL Alpha 值裁剪【英文标题】:Low OpenGL alpha values cropping 【发布时间】:2015-03-15 15:26:22 【问题描述】:

我已将 DLL 注入到游戏进程中以制作覆盖界面,但问题是 alpha 值被“裁剪”(根本不渲染)

我已经测试了几个 alpha 值,如果 alpha 低于 0.3,它似乎会失败。

为了说明发生了什么,我尝试渲染的图像是:

而重绘图像的游戏是:

这里到底发生了什么?它的opengl的当前状态?我是 API 新手,不知道为什么会这样。

更多信息:

纹理是从缓冲区创建的:

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, this->width, this->height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, this->buffer);

我从 Awesomium 收到这个缓冲区,并且值是正确的...我检查了 alpha 值。

渲染是使用这个函数完成的(我也试过调用游戏的纹理渲染函数,但同样的问题发生了):

void DrawTextureExt(int texture, float x, float y, float width, float height)

    glPushAttrib(GL_ALL_ATTRIB_BITS);
    
        glPushMatrix();
        
            glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

            glEnable(GL_BLEND);
            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
            // glBlendFunc(GL_ONE, GL_ONE); << tried this too.. ugly results

            glEnable(GL_TEXTURE_2D);
            glBindTexture(GL_TEXTURE_2D, texture);

            glTranslatef(x, y, 0.0);

            glRotatef(0, 0.0, 0.0, 1.0);
            glTranslatef(-x, -y, 0.0);

            glBegin(GL_QUADS);
            
                glTexCoord2f(0, 0); glVertex2f(x, y);
                glTexCoord2f(0, 1); glVertex2f(x, y + height);
                glTexCoord2f(1, 1); glVertex2f(x + width, y + height);
                glTexCoord2f(1, 0); glVertex2f(x + width, y);
            
            glEnd();

            glBindTexture(GL_TEXTURE_2D, 0);
        
        glPopMatrix();
    
    glPopAttrib();

【问题讨论】:

【参考方案1】:

在我看来,您要连接的程序在其渲染功能结束时使用了 alpha 测试(这很有意义),并在最后启用了 alpha 测试,然后您就会遇到这种情况。试试如果你首先在你的钩子中禁用 alpha 测试会发生什么。 (glDiable(GL_ALPHA_TEST))。

【讨论】:

以上是关于低 OpenGL Alpha 值裁剪的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL中的三维裁剪

在 OpenCL 上通过凹多边形进行图像裁剪

裁剪坐标系和标准化设备坐标系(OpenGL)中的裁剪

使用 lwjgl/opengl 进行简单裁剪

OpenGL投影裁剪

opengl算法学习--- 直线裁剪算法