2013-04-20 123 views
3

如果要在3D對象(例如立方體)的表面上放置紋理,我可以使用該立方體的頂點來描述此紋理的位置。在3D表面放置多個圖像

但是如果我想在同一平面上放置多個獨立的圖像呢?或者假設它只是一個圖像,但我不希望它出現在頂點所在的曲面邊緣,而是出現在曲面中間的小的地方。我想要在運行時動態選擇和放置實際圖像,否則我可以將它們作爲單個紋理離線濃縮。

我有一個方法,但我想諮詢一下是否有更好的方法,或者這是完全可以接受的

我的猜測是創建多個獨立的2D四邊形(以0深度),每個都有一個與它們相關的紋理並放置在它們上面(它們當然可以是具有不同紋理座標的紋理圖集)。

然後,我轉換這些四邊形,使它們看起來像在一個3D對象(如立方體)的表面上。當然,我必須維護一個矩陣層次結構,以便在多維數據集轉換時適當地轉換這些四邊形,以使它們看起來像是連接到多維數據集。

雖然這不一定困難,但我對紋理感到陌生,並且想知道這是否正常。

+0

你想要做的事情根本不是正常的做法,所以很難說對於人們通常不會做的事情,「正常實踐」是什麼。通常構建紋理以按原樣使用。如果你需要牆上的某些東西,那麼你的紋理藝術家實際上會把它放在牆的紋理中,或者你的建模者會把一個嵌入牆上的多邊形放到牆上,這是紋理藝術家特別喜歡的東西。 – 2013-04-20 11:18:04

+1

@NicolBolas在我的研究中,我發現我所要求的不同於將位圖字體中的不同字形呈現到表面上,其中每個字形是從相同紋理採集的不同圖像。我發現的一個流行的實現實際上基本上是我上面提到的(除了紋理中的字形圖像而不是其他類型的圖像),所以我認爲這並不罕見。 – johnbakers 2013-04-20 12:20:22

+0

@SebbyJohanns像表面上的3D貼花比構成表面的紋理拼貼畫一樣? – james82345 2013-04-20 12:46:56

回答

0

但是如果我想在同一平面上放置多個獨立的圖像呢?

使用多個紋理,也許每個紋理都有自己的一組紋理座標。你的OpenGL實現將爲你提供一些編輯器單元。他們每個人都可以提供不同的紋理。

glActiveTexture(GL_TEXTURE_0 + i); 
glBindTexture(…); 
glUniform1i(texturesampler[i], i); // texturesampler[i] contains the sampler uniform location of the bound program. 

或者假設它僅僅是一個形象,但我不希望它出現在表面,其中頂點的邊緣,而是地方小,在表面的中間。

這就是GL_CLAMP ...紋理環繞模式可以使用的地方。

glTexParameteri(GL_TEXTURE_WRAP_{S,T,R}, GL_CLAMP[_TO_{EDGE,BORDER}]); 

與那些指定紋理座標在頂點處爲間隔,但代替重複圖像將僅顯示一個時間,只有邊緣像素重複外面[1 0,]。如果你使邊緣像素透明,就好像那裏沒有圖像。

+0

在我的研究中,我發現我所要求的與將不同的字形從位圖字體渲染到表面上並沒有多大區別,其中每個字形都是從相同紋理獲取的不同圖像。我發現的一個流行實現實際上是基於我上面提出的建議(除了紋理中的字形圖像而不是其他類型的圖像)。 – johnbakers 2013-04-20 12:20:58

1

您可以嘗試渲染場景並將其另存爲紋理,然後在表面上使用該紋理。

結賬glCopyTexImage2D()glCopyTexSubImage2D()

或者嘗試使用幀緩衝區對象。

+0

有趣的功能,雖然不知道他們會在這個特殊的例子中更聰明,但他們確實看起來像其他需要的有用的技術。如果我在這裏使用它們,我仍然必須做我正在做的事情,但是隨後每次更新圖像時都會產生複製紋理的開銷;因爲我打算通常更新圖像,這可能不雅觀 – johnbakers 2013-04-20 01:27:44

+0

另一種方法是通過組合其他紋理圖像的數據來重新創建紋理。你將不得不保持緩存在內存中的圖像數據,也可能會有很多開銷。我認爲你目前的做法可能是最好的。 – james82345 2013-04-20 01:34:20

+0

謝謝;我希望這裏的一些大槍能夠提供一些見解。據我所知,幾乎總是有多種方法來完成OpenGL或圖形中的某些功能。 – johnbakers 2013-04-20 01:37:28