Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.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
Opengl 绘制32位的二维图像_Opengl - Fatal编程技术网

Opengl 绘制32位的二维图像

Opengl 绘制32位的二维图像,opengl,Opengl,我试图在屏幕上画一个像素缓冲区。当我画画时,黑色被画成透明的,这是完美的。然而,其他颜色也是透明的。我似乎不明白为什么 我使用以下方式绘制: glDrawPixels(width, height, GL_BGRA, GL_UNSIGNED_BYTE, buffer); 绘制32位bmp。但是,位图不会显示,除非我将其转换为24位并使用GL_BGR。我做错什么了吗?黑色是透明的有什么原因吗 在抽签之前,我会: void Enable2DDrawing(bool &DrawingEnabl

我试图在屏幕上画一个像素缓冲区。当我画画时,黑色被画成透明的,这是完美的。然而,其他颜色也是透明的。我似乎不明白为什么

我使用以下方式绘制:

glDrawPixels(width, height, GL_BGRA, GL_UNSIGNED_BYTE, buffer);
绘制32位bmp。但是,位图不会显示,除非我将其转换为24位并使用GL_BGR。我做错什么了吗?黑色是透明的有什么原因吗

在抽签之前,我会:

void Enable2DDrawing(bool &DrawingEnabled, bool &GLTexture2D, bool &GLRectangleTexture, bool &PointSmooth, float &PointSize)
{
    if (!DrawingEnabled)
    {
        GLTexture2D = glIsEnabled(GL_TEXTURE_2D);
        GLRectangleTexture = glIsEnabled(GL_TEXTURE_RECTANGLE);
        PointSmooth = glIsEnabled(GL_POINT_SMOOTH);
        glGetFloatv(GL_POINT_SIZE, &PointSize);

        glDisable(GL_TEXTURE_RECTANGLE);
        glDisable(GL_TEXTURE_2D);
        glEnable(GL_POINT_SMOOTH);
        glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);

        glPushMatrix();
        glLoadIdentity();
        DrawingEnabled = true;
    }
}
在画画之后,我会:

void Disable2DDrawing(bool &DrawingEnabled, bool GLTexture2D, bool GLRectangleTexture, bool PointSmooth, float PointSize)
{
    if (DrawingEnabled)
    {
        glPopMatrix();
        if (GLTexture2D) glEnable(GL_TEXTURE_2D);
        if (GLRectangleTexture) glEnable(GL_TEXTURE_RECTANGLE);
        if (PointSmooth) glDisable(GL_POINT_SMOOTH);
        DrawingEnabled = false;
    }
}
然后交换缓冲区。我还尝试通过以下方式使用纹理绘制:

GLuint LoadTexture(void* Buffer, int width, int height, GLenum Target)
{
    GLuint ID = 0;
    glGenTextures(1, &ID);
    glBindTexture(Target, ID);
    glTexParameteri(Target, GL_TEXTURE_WRAP_S, Target == GL_TEXTURE_2D ? GL_REPEAT : GL_CLAMP_TO_EDGE);
    glTexParameteri(Target, GL_TEXTURE_WRAP_T, Target == GL_TEXTURE_2D ? GL_REPEAT : GL_CLAMP_TO_EDGE);
    glTexParameteri(Target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(Target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(Target, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, Buffer);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    return ID;
}

void DrawTexture(std::uint32_t Target, std::uint32_t ID, float X1, float Y1, float X2, float Y2, int Width, int Height)
{
    Width = Target == GL_TEXTURE_RECTANGLE ? Width : 1;
    Height = Target == GL_TEXTURE_RECTANGLE ? Height : 1;

    glEnable(Target);
    glBindTexture(Target, ID);
        glBegin(GL_QUADS);
        glTexCoord2f(0, Height);
        glVertex2f(X1, Y1); //top left
        glTexCoord2f(0, 0); //bottom left
        glVertex2f(X1, Y2);
        glTexCoord2f(Width, 0);
        glVertex2f(X2, Y2);  //bottom right
        glTexCoord2f(Width, Height);
        glVertex2f(X2, Y1);  //top right
    glEnd();
    glDisable(Target);
}
但它不能正确绘制位图。它绘制32位bmp,如: 当它应该是完全白色的时候。如果我把每个像素都画成1乘1,效果会很好。我错过什么了吗


绘制32位位图的最佳方法是什么?我必须使用glPixelStorei吗?是否有人有绘制位图的示例代码或关于如何绘制位图的详细说明?

是否启用了混合

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

不,我没有那样做。我禁用了它。这会导致我的问题吗?是的,如果禁用混合,OpenGL将无法对alpha通道执行任何操作。您还需要指定混合函数(在我的例子中的第一行)。只是FIY,固定函数流水线(<代码> GLADEX,<代码> GLVTEX2F < /代码>等)现在被禁止,您应该考虑使用OpenGL 3 +/OpenGL ES 2 +中的可编程流水线。