2011-04-26 94 views
2

我已經加載紋理到OpenGL之前,工作正常。但這次我想在我的渲染類的構造函數中加載紋理。 (即時通訊使用MVC抽象基類作爲接口)。我原本是試圖加載一個PNG文件,而不是像我之前做的那樣,所以我認爲這是與這樣做,但是當我回到我的bmp代碼它仍然無法正常工作。因此,我將bmp紋理代碼移植到了主要(同一個MVC項目)中,並且工作正常。這wasnt工作的實際部分是:glGenTexture只能在主體中工作嗎?

GLuint textureId; 
    glGenTextures(1, &textureId); 
    glBindTexture(GL_TEXTURE_2D, textureId); 
    //Map the image to the texture 
    glTexImage2D(GL_TEXTURE_2D,//This bit!!    
       0,       
       GL_RGB,      
       image->width, image->height, 
       0,        
       GL_RGB, 
       GL_UNSIGNED_BYTE,         
       image->pixels); 

如果我通過我注意到,textureID保持不變的程序階梯(沒有改變1監守沒有質感被映射到它)

這是爲什麼?它可以修復嗎?

+2

glGenTextures當然也在主要外部工作。它在綁定有效上下文時起作用。它所做的僅僅是保留一個用作紋理標識符的數字,而不是更多。 – Damon 2011-04-26 01:14:42

+0

@Damon:我明白了......那麼爲什麼完全相同的代碼不能在我的構造函數中工作,而是會在主函數中工作? – QuantumKarl 2011-04-26 01:18:39

回答

3

何時調用構造函數?您需要一個有效的OpenGL上下文來進行任何GL調用。通常的錯誤是在全局範圍創建對象,這意味着該對象是在程序開始時,在調用main()之前構造的,並且此時尚未創建OpenGL上下文。

+0

這就是它!它在主要和全局對象之前。非常感謝! (它不會在紅皮書中告訴你這些事情) – QuantumKarl 2011-04-26 06:08:15

1

看起來像是你將textureId變成了一個局部變量,噹噹前函數(構造函數)完成時它會消失。如果你想讓它活得更久,試試一個類成員變量。

+0

我相信我做到了。這只是爲了展示哪些代碼在最小代碼時出錯。我在頭文件中創建了它(私有的,也是公開的),使用啓動列表將它賦值爲零。我也不會在構造函數中看到textureID變爲1嗎?(在構造函數作用域結束之前)我是用不同的方法將其渲染爲構造函數,所以它會給出一個未定義的錯誤。 PS抱歉,我應該在問題中包含這個 – QuantumKarl 2011-04-26 01:50:16

相關問題