2015-07-19 420 views
-1

我想獲得一個OpenGL紋理在2D中在屏幕上呈現。我知道這看起來很簡單,但我是OpenGL新手,這給我帶來了一些麻煩。爲什麼我的OpenGL紋理顯示爲白色?

無論我嘗試什麼,它都顯示出白色。

我已經看到其他問題,如OpenGL renders texture all white,並檢查了清單上的所有內容,但我似乎無法弄清楚源代碼,我非常感謝任何幫助。

我很確定我在某個地方犯了一些愚蠢的錯誤,並且試圖廢棄我的代碼並重寫了幾次。

以下是與主要方法運行的窗口相關的代碼。

//Window is a custom wrapper for GLFWwindow 
Window thirdwindow(window_width, window_height, "Three"); 
thirdwindow.show(); 
thirdwindow.setPosition(300, 300); 

ThirdLoop(thirdwindow); 

這裏是ThirdLoop:

static void ThirdLoop(Window& win) 
{ 
    GLuint tex = loadBMP("cat.bmp"); 
    auto size = win.getWindowSize(); 
    win.beginDraw(); 
    while (running) 
    { 
     if (win.isClosing()) 
      running = false; 

     glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set background color to black and opaque 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   // Clear the color buffer (background) 

     DrawImage(size, tex); 
     win.render(); 

     Update(); 
    } 
} 

和的DrawImage(對於奇縮進道歉這裏,一個複製粘貼的東西)

void DrawImage(const Size<int>& size, GLuint texture) { 
glMatrixMode(GL_PROJECTION); 
glPushMatrix(); 
glLoadIdentity(); 
glOrtho(0.0, size.width, 0.0, size.height, -1.0, 1.0); 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 

glLoadIdentity(); 
glDisable(GL_LIGHTING); 

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

// Draw a textured quad 
glBegin(GL_QUADS); 
glTexCoord2f(0, 0); glVertex3f(0, 0, 0); 
glTexCoord2f(0, 1); glVertex3f(0, 100, 0); 
glTexCoord2f(1, 1); glVertex3f(100, 100, 0); 
glTexCoord2f(1, 0); glVertex3f(100, 0, 0); 
glEnd(); 

glDisable(GL_TEXTURE_2D); 
glPopMatrix(); 

glMatrixMode(GL_PROJECTION); 
glPopMatrix(); 

glMatrixMode(GL_MODELVIEW); 
} 

loadBMPhttp://www.opengl-tutorial.org/beginners-tutorials/tutorial-5-a-textured-cube/拍攝。

+0

您是否嘗試過通過GPU調試運行呢?如果您使用的是AMD卡,則可能與[GPU Perf Studio](http://developer.amd.com/tools-and-sdks/graphics-development/gpu-perfstudio/)類似;我認爲NVIDIA有相同的東西。 – Nitori

回答

1

你可以試試這個:

unsigned int CreateTexture(unsigned int Width, unsigned int Height, unsigned char* Pixels) 
{ 
    unsigned int ID = 0; 
    glGenTextures(1, &ID); 
    glBindTexture(GL_TEXTURE_2D, ID); 
    glPixelStorei(GL_UNPACK_ROW_LENGTH, Width); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_BGRA, GL_UNSIGNED_BYTE, Pixels); 
    glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    return ID; 
} 

void DestroyTexture(unsigned int ID) 
{ 
    glDeleteTextures(1, &ID); 
} 

void DrawTexture(unsigned int ID, float X1, float Y1) 
{ 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, ID); 
    glColor4ub(0xFF, 0xFF, 0xFF, 0xFF); 
    glBegin(GL_QUADS); 
    glTexCoord2f(0.0f, 1.0f); 
    glVertex2f(X1, Y1); 
    glTexCoord2f(0.0f, 0.0f); 
    glVertex2f(X1, Y2); 
    glTexCoord2f(1.0f, 0.0f); 
    glVertex2f(X2, Y2); 
    glTexCoord2f(1.0f, 1.0f); 
    glVertex2f(X2, Y1); 
    glEnd(); 
    glDisable(GL_TEXTURE_2D); 
} 

我用下面的設置窗口:

static float angle = 0.0f; 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

int w = 800; 
int h = 600; 
glOrtho(0.0f, w, h, 0.0f, 0.0f, -1.0f); 

glMatrixMode(GL_MODELVIEW); 
glShadeModel(GL_SMOOTH); 
glClearColor(0.0f, 40.0f/256.0f, 100.0f/256.0f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glClearDepth(1.0f); 

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


glPushMatrix(); 
glTranslatef(400, 300, 0); 
glScalef(100, 100, 0); 
glRotatef(angle, 0.0f, 0.0f, 1.0f); 

if (TextureID == 0) 
{ 
    TextureID = CreateTexture(Width, Height, Pixels); //I used the ImageLoader from the comments that I posted. 
} 
DrawTexture(TextureID, 0.0f, 0.0f); 

glPopMatrix(); 
++angle; 

SwapBuffers(DC); 
Sleep(1); 

enter image description here

+0

謝謝,但它仍然顯示爲白色。 – russellsayshi

+0

無論您傳遞的是像素可能不正確還是格式與BGRA不匹配。該網站上的位圖加載功能不會響應像素偏移量。它也不處理24位格式。 – Brandon

+0

嘗試加載位圖:http://stackoverflow.com/questions/20595340/loading-a-tga-bmp-file-in-c-opengl它不處理24位位圖,但至少它尋求向右像素的偏移量。 – Brandon