Проблемы с прозрачностью растрового изображения в C ++ OpenGL

0

Я начал с текстуры opengl, и все было хорошо. Теперь я пытаюсь загрузить bmp и сделать прозрачную прозрачную часть с помощью glEnable (GL_BLEND); и glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Это мой исходный код:

float kSpeedForw=0.0f;
GLuint      texture[1];
CCamera g_Camera;                                   
GLfloat     xrot = 0;                              
GLfloat     yrot = 0;                          
GLfloat     zrot = 0;                        
bool  g_bFullScreen = true;                             
HWND  g_hWnd;                                       
RECT  g_rRect;                                          
HDC   g_hDC;                                        
HGLRC g_hRC;                                        
HINSTANCE g_hInstance;                                  
float jump = -0.1;
GLfloat LightAmbient[] = { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat LightDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat LightPosition[] = { 0.0f, 0.0f, 2.0f, 1.0f };
void Init(HWND hWnd)
{
glEnable(GL_TEXTURE_2D);                            // Enable Texture Mapping
glShadeModel(GL_SMOOTH);                            // Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);               // Black Background
glClearDepth(1.0f);                                 // Depth Buffer Setup
glEnable(GL_DEPTH_TEST);                            // Enables Depth Testing
glDepthFunc(GL_LEQUAL);                             // The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  // Really Nice Perspective Calculations

glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);     // Setup The Ambient Light
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);     // Setup The Diffuse Light
glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);   // Position The Light
glEnable(GL_LIGHT1);                                // Enable Light One

glColor4f(1.0f, 1.0f, 1.0f, 0.5);                   // Full Brightness.  50% Alpha
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
g_hWnd = hWnd;                                      
GetClientRect(g_hWnd, &g_rRect);                
InitializeOpenGL(g_rRect.right, g_rRect.bottom);
g_Camera.PositionCamera(0, 1.5f, 6, 0, 1.5f, 5, 0, 1, 0);
ShowCursor(false);                      
}
GLuint LoadTexture(const char * filename)
{

glEnable(GL_TEXTURE_2D);
GLuint texture;

int width, height;

unsigned char * data;

FILE * file;

file = fopen(filename, "rb");
if (file == NULL) return 0;
if (filename=="Data/weed.bmp"){
    width = 200;
    height = 200;
}
if (filename == "Data/gun.bmp"){
    width = 300;
    height = 300;
}
data = (unsigned char *)malloc(width * height * 3);
fread(data, width * height * 3, 1, file);
fclose(file);

for (int i = 0; i < width * height; ++i)
{
    int index = i * 3;
    unsigned char B, R;
    B = data[index];
    R = data[index + 2];

    data[index] = R;
    data[index + 2] = B;

}
if (filename == "Data/weed.bmp"){
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);


    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, GL_RGB, GL_UNSIGNED_BYTE, data);
    free(data);
}
if (filename == "Data/gun.bmp"){
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, 3,width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

}


return texture;
}


WPARAM MainLoop() // main function
{
MSG msg;
Init(g_hWnd);
glClearColor(0, 0, 255, 0);
while (1)                                           
{                                                   
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        if (msg.message == WM_QUIT)                 
            break;
        TranslateMessage(&msg);                 
        DispatchMessage(&msg);                      
    }
    else if (LockFrameRate(60))                 
    {
        g_Camera.SetViewByMouse();                  
        kSpeedForw = 0;
    if (jump > -0.1)jump-=0.01;

        CheckForMovement();                     


        g_Camera.MoveCamera(kSpeedForw, jump);
        RenderScene();                              
    }
    }

DeInit();
return(msg.wParam);                             
}
void RenderScene()
{
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glDisable(GL_BLEND);
glEnable(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();                                   
gluLookAt(g_Camera.m_vPosition.x, g_Camera.m_vPosition.y, g_Camera.m_vPosition.z,
g_Camera.m_vView.x, g_Camera.m_vView.y, g_Camera.m_vView.z,
g_Camera.m_vUpVector.x, g_Camera.m_vUpVector.y, g_Camera.m_vUpVector.z);


GLuint texture;
texture = LoadTexture("Data/weed.bmp");
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_QUADS);                              
float i = 0;
glColor3f(1,1,1);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-10 + i / 5, 0, 10 - i / 5);


glTexCoord2f(50.0f, 0.0f);
glVertex3f(-10 + i / 5, 0, -10 + i / 5);


glTexCoord2f(50.0f, 50.0f);
glVertex3f(10 - i / 5, 0, -10 + i / 5);


glTexCoord2f(0.0f, 50.0f);
glVertex3f(10 - i / 5, 0, 10 - i / 5);
glEnd();                            
////////////////////////////////////////////////////////////HUD
glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glDisable(GL_SMOOTH);
glEnable(GL_BLEND);         // Turn Blending On

int vPort[4];

glGetIntegerv(GL_VIEWPORT, vPort);

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();

glOrtho(0, vPort[2], 0, vPort[3], -1, 1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();

GLuint ruka;
ruka = LoadTexture("Data/gun.bmp");
glBindTexture(GL_TEXTURE_2D, ruka);
glBegin(GL_QUADS);


glTexCoord2f(0.0f, 0.0f);
glVertex2f(0, 0);

glTexCoord2f(1.0f, 0.0f);
glVertex2f(450,0);

glTexCoord2f(1.0f, 1.0f);
glVertex2f(450,450);

glTexCoord2f(0.0f, 1.0f);
glVertex2f(0,450);
glEnd();



SwapBuffers(g_hDC);
}

Код работает хорошо для загрузки и рендеринга платформы (weed.bmp), а также загружает и отображает пистолет. Но большая часть gun.bmp белая. Я надеялся, что эта часть станет прозрачной. Я также надеялся добавить больше возможностей HUD, которые также должны быть частично прозрачными.

Мой файл gun.bmp: https://drive.google.com/file/d/0BxxlNcAI0eh9cHZGd1ZfMTFwYmM/view?usp=sharing

Если вы знаете решение этой проблемы, пожалуйста, напишите об этом. благодаря

  • 0
    Мне действительно интересно, как вы ожидаете, что белый волшебным образом становится прозрачным, если включить GL_BLEND .
  • 0
    Я попытался загрузить 32-битный BMP с альфа-каналами и загрузить как GL_RGBA, но он сразу же потерпел крах. Я не знаю, упускаю ли я что-то здесь, но если так, пожалуйста, объясните мне, что. Я был бы очень благодарен.
Показать ещё 3 комментария
Теги:
opengl
bitmap

1 ответ

0

Вы загружаете изображение как GL_RGB, вы хотите, чтобы GL_RGBA имел альфа-канал. Кроме того, вам нужна битовая карта 32 бит (8 бит/канал × 4 канала = 32 бита).

  • 0
    Благодарю. На самом деле, я пробовал это, но это привело к краху Immediete
  • 0
    Вы должны использовать 32-битные растровые изображения и читать width * height * 4 байта.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню