簡體   English   中英

在OpenGL C ++中加載32位.bmp紋理時出現問題

[英]Problems Loading 32 bit .bmp texture in opengl c++

我在opengl游戲中加載32位.bmp圖像時遇到了一些麻煩。 到目前為止,我可以完美地加載和顯示24位。 我現在要加載位圖,其紋理的某些部分是透明或不可見的。

此功能使用24位沒有問題。 但是帶有alpha通道.bmp的32位似乎會使顏色失真並在意想不到的地方透明地造成。

Texture LoadTexture( const char * filename, int width, int height, bool alpha) 
    {
        GLuint texture;
        GLuint* data;
        FILE* file;

        fopen_s(&file, filename, "rb");  
        if(!file)
        {
            std::cout << filename <<": Load Texture Fail!\n";
            exit(0);
        }

        data = new GLuint[width * height];

        fread( data, width * height * sizeof(GLuint), 1, file ); 
        fclose(file);

        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);
        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);

        if(alpha) //for .bmp 32 bit
        {
            glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
            glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
        }
        else //for .bmp 24 bit
        {
            glPixelStorei(GL_UNPACK_ALIGNMENT, 4); 
            glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, data);
        }

        std::cout<<"Texture: "<<filename<< " loaded"<<std::endl;
        delete data;

        return Texture(texture); 
    }

在游戲紋理中,在平面上繪制 在此處輸入圖片說明

這可能看起來像在工作,但是0xff00ff顏色應該是透明的。 如果我在Photoshop中反轉Alpha通道,則結果是相同的,內球始終是透明的。

我還啟用了:

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

透明性沒有問題,問題似乎在於使用Alpha通道加載位圖。 我加載的所有位圖似乎都在右側偏右。 只是想知道是否有這個原因?

我將以您的文件“解析”實際上是正確的假設來回答這個問題。 文件數據只是.BMP的圖像部分而沒有任何頭信息。

glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);

glPixelStorei(GL_UNPACK_ALIGNMENT, 4); 
glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, data);

我很好奇您的3分量數據是BGR順序,而您的4分量數據是RGBA順序。 特別是如果此數據來自.BMP文件(盡管它們不允許使用alpha通道)。 您確定您的數據沒有其他順序嗎? 例如,也許ABGR命令?

另外, 停止使用數字表示圖像格式 你應該用一個真實的, 容量內部格式為您的紋理,而不是“3”或“4”。

所以我用Visual C 2012編譯的代碼為我100%的工作

glBindTexture(GL_TEXTURE_2D, texture_id);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); //Thia is very important!!!!
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,  imag_ptr,  ptr->image->height, 0,GL_RGBA, GL_UNSIGNED_BYTE, imag_ptr); 

比在渲染中我使用

glPushMatrix();
glTranslatef(0,0,0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 1);
glEnable(GL_BLEND);
glColor4ub(255,255,255,255);  //This is veryveryvery importent !!!!!!!!!!! (try to play and you see)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBegin(GL_QUADS);
glTexCoord3d(1,  1,  0);
glVertex2f(8,8);
glTexCoord3d(0,  1,  0);
glVertex2f(-8,8);
glTexCoord3d(0,  0,  0);
glVertex2f(-8,-8);
glTexCoord3d(1,  0,  0);
glVertex2f(8,-8);
glEnd();
glEnd();
glDisable(GL_TEXTURE_2D);
glPopMatrix();

並且我使用例如android png圖標和另一個,我嘗試發布另一個圖像,但是對此我沒有惡意,因此如果您希望我將其發送給您

因此,所有這些都是png格式,但是是bmp格式和tga,您必須將顏色從ARGB轉換為RGBA,而這不能正常工作

for( x=0;x<bmp_in_fheader.width;x++)
    {
        t=pixel[i];
        t1=pixel[i+1];
        t2=pixel[i+2];
        t3=pixel[i+3];

        pixel_temp[j]=t2;
        pixel_temp[j+1]=t1;
        pixel_temp[j+2]=t;
        pixel_temp[j+3]=t3;

        i+=4;
        j+=4;
    }

==下一個==要在Photoshop中創建它們,您必須刪除背景並繪制新圖層,而不是在通道中添加Alpha圖層! 對於alpha來說,非常重要的是,所有黑色都代表透明度,並且您的圖像只能是白色

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM