2012-11-22 53 views
0

我有一個矩形由兩個四邊形(8個頂點,我使用索引三角形):一個矩形(兩個連接的四邊形)與兩個紋理 - 錯誤與他們的共同邊界

------+------ 
| \ | \ | 
| \ | \ | 
| \ | \ | 
______+______ 

我也有兩個紋理的它。我將它們都綁定到着色器。

我想紋理的第一個紋理的矩形(左四邊形)的一部分和第二個紋理的另一部分。

但是,當我選擇基於頂點在像素着色器中的位置的紋理時,我用由「+」標記的頂點有問題。有一次,我分析了第一個四邊形的「+」頂點,但是具有相同位置的頂點也在第二個四邊形中(並且必須有第二個紋理)。所以按位置設置紋理會導致錯誤。

如何確定要分配的紋理(在採樣器中)?我不想進行第二遍或向着色器添加額外信息(如果有任何選項不使用它)。

基本上說:我有模型和它的邊緣。該邊緣說明了紋理的變化。但如何實現這一目標?當我在該邊的頂點上設置texture1或texture2時,會出現一些錯誤。

+0

你的問題並不完全清楚。讓我們看看我是否理解正確。你將兩個紋理綁定到着色器。根據頂點的值在着色器內部?指數的價值?變換頂點的值?您選擇要採樣的紋理。我理解正確嗎?我建議編輯你的問題,以說明你在做什麼以及按什麼順序,在哪個着色器中的頂點或像素? –

回答

1

我認爲你的方法是錯誤的。着色器中的條件分支會減慢着色器,應儘可能避免。原因是着色器被優化爲並行地爲每個像素執行相同的代碼。如果根據grphics卡實現條件,將會發生以下情況之一:着色器將執行條件的兩個分支,並在執行後爲每個像素選擇適當的路徑,或者將所有像素等待到最長路徑的條件已經完成執行,然後繼續。

在你的情況下,你試圖用兩種紋理繪製一個圖元。以這種方式定義時,這是不可能的。可如果你改變觀念可以輕鬆實現你想要的效果:

我能想到的兩種可能的方法(可能還有更多):

  1. 第一和最簡單的是O繪製每個有兩個四邊形它是自己的紋理。這是真的,你會調用你的着色器兩次,但我幾乎看不到任何真正的減速,因爲無論如何都會繪製確切的像素數。
  2. 第二種方法稍微複雜一點,但可以讓你畫一次。你需要做的是創建一個包含兩個紋理的大紋理,並將整個紋理映射到整個三角形條上。通過這種方式,渲染器將確保每個四元組都具有「自己」的紋理。 OpenGl使用glTexSubimage2D完成。在Direct3D 9更復雜,您使用以下順序:
    A.創建使用CreateTexture
    B.獲取表面使用IDirect3DTexture9::GetSurfaceLevel()
    C. 0級紋理加載圖像到使用D3DXLoadSurfaceFromMemory()
    D.表面釋放表面

因此,您將水平紋理座標從0到0.5映射到第一個四邊形的頂點,並將從0.5到1的座標映射到第二個四邊形的頂點。如果四邊形的大小不一樣或紋理的大小不一樣,只需更改映射

如果您堅持在着色器中使用條件分支,則應該記住您正在討論的是一列像素只有兩個頂點(畢竟這是一個像素着色器),所以你應該檢查所有的像素。這可能是一個問題,因爲除非沒有變換,否則無法知道每個像素的變換結果。最好不要查詢像素着色器中的頂點值。

希望這會讓你走上正軌