| 使用已渲染出來的紋理 來到這裡,我們已經把螢幕的資料渲染到了一個映像紋理上。現在我們來看一看如何來使用這張已經渲染好了的映像紋理。這個操作的本身其實是很簡單的,我們只要把這張映像紋理當作普通紋理一樣,綁定為當前紋理就可以了。 glBindTexture(GL_TEXTURE_2D, img);
以上這一函數調用完成之後,這張映像紋理就成了一個在繪圖的時候用於被讀取的普通紋理。 根據你在初始化時所指定的不同紋理濾波方式,你也許會希望為該紋理產生多重映像(mipmap)資訊。如果要建立多重映像資訊,多數的人都是在上傳紋理資料的時候,通過調用函數gluBuild2DMipmaps()來實現,當然有些朋友可能會知道如何使用自動產生多重映像的擴充,但是在FBO擴充中,我們增加了第三種產生映像的方法,也就是使用GenerateMipmapEXT()函數。 這個函數的作用就是讓OpenGL幫你自動建立多重映像資訊。中間實現的過程,根據不同的顯卡會有所不同,我們只關心它們最終的結果是一樣就行了。值得注意的是:對於這種通過FBO渲染出來的紋理,要實現多重映像的話,只有這一種方法是正確的,這裡你不可以使用自動產生函數來產生多重映像,這其中的原因有很多,如果你想深入瞭解的話,可以查看一下技術文檔。 使用這一函數使方便,你所要做的就是先把該紋理對像綁定為當前紋理,然後調用一次該函數就可以了。 glGenerateMipmapEXT(GL_TEXTURE_2D); OpenGL將會自動為我們產生所需要的全部資訊,到現在我們的紋理便可以正常使用了。 一個重點要注意的地方:如果你打算使用多重映像(如 GL_LINEAR_MIPMAP_LINEAR),該函數glGenerateMipmapEXT()必須要在執行渲染到紋理之前調用。 在建立紋理的時候,我們可以按以下代碼來做。 glGenTextures(1, &img);glBindTexture(GL_TEXTURE_2D, img);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);glGenerateMipmapEXT(GL_TEXTURE_2D); 到現在,這張紋理和普通紋理沒什麼區別,我們就按處理普通紋理的方法來使用就可以了。 |