2013-01-03 60 views
0

我當前的渲染器通過其頂點的位置和顏色繪製窗體。它還不能處理紋理。如果無法加載紋理,則回退爲純色

struct Form 
{ 
    unsigned int Positions, Colors, Elements, Program; 
}; 

現在我想實現紋理的能力。由於在最終遊戲中不會有沒有紋理但顏色的表單,我想要替換顏色特徵而不是開發旁邊的特徵。

因此,渲染器必須通過其頂點的位置和紋理座標來繪製窗體。

struct Form 
{ 
    unsigned int Positions, Coordinates, Elements, Texture, Program; 
}; 

到目前爲止,這麼好。但是,如果沒有紋理渲染的能力,我的應用程序不能繪製表單,如果他們的圖像文件不存在或由於某種原因無法加載。因此,如果圖像文件無法加載,我想實現一個後備到一個給定的純色(如粉紅色)。

如何在不完全開發兩個並排功能的情況下實現此後備?有沒有共同的方法?我希望這可以在着色器中完成。或者,也許我可以向視頻卡發送粉紅色紋理,然後將所有表單視爲相同。可悲的是,我不知道如何實現,甚至可能。

回答

1

如果您從未綁定紋理的紋理單元進行採樣,則檢索的樣本總是呈白色;從沒有完整紋理邊界的紋理進行採樣不是錯誤。因此,您可以使用該白色以後備顏色對其進行調製。

+0

白色作爲後備顏色就好了,這並不重要。所以我可以傳遞一個空指針到'glTexImage2D'並且網格會被繪製? – danijar

+1

@sharethis:向glTexImage2D傳遞一個空指針實際上是初始化一個紋理對象。如果你爲所有mipmap級別執行此操作,你將獲得完整的mipmappable紋理!或者你只需​​指定級別0並關閉mipmapping。我正在考慮glBindTexture(GL_TEXTURE_ ...,0),但用空指針初始化紋理也很好。 – datenwolf

+0

這很好,因爲用空指針初始化紋理不需要切換mipmapping。無論如何,現在顏色是黑色的,但這並不重要。也許是因爲它是默認的紋理邊框顏色... – danijar

4

我已經通過程序創建一個虛擬檢查器紋理並將其分配給任何沒有任何有效紋理的對象來解決此問題。它不是基於頂點顏色或網格顏色,而是起作用。並且不需要更改着色器,只需幾行代碼即可檢查空紋理。

+0

更好的是不使用顏色,這就是我的意思。你能透露一些實施細節嗎? – danijar

+1

爲這種情況準備一個小紋理。你可能有一些textrues的資源管理器。如果找不到合適的紋理,請使用您爲此場景準備的紋理。我現在沒有代碼。 – Matzi

+0

我明白這個方法。所以我會找出如何在代碼中定義一個像素紋理。 – danijar