2013-08-27 32 views
1

我剛完成了我的高度圖,每行用三角形條紋渲染。我的解決辦法是:基於索引的紋理高度圖(OpenGL/GLSL)

height=data[k]; 
coords.push_back((float)col); 
coords.push_back((float)(height/heightscale)); 
coords.push_back((float)row); 
k+=3; //red is enough, im using greyscale 

和帶索引:

for(int row=0;row<infoheader.biHeight-1;row++) 
    { 
    for(int col=0;col<infoheader.biWidth;col++) 
    { 
     indexes.push_back((row+1)*infoheader.biWidth+col); 
     indexes.push_back(row*infoheader.biWidth+col); 
    } 
    } 

我使用VertexArrayObject和drawelements在每行一個循環。 現在我用一個着色器着色基於高度,但我希望它與紋理結合(也基於高度,但仍然不是我的問題)

我想把紋理放在2個三角形形成四,

0,1-1,1  
| /| 
|/| 
|/ | 
0,0-1,0 

...但我真的不知道如何實現它,我讀過有關這一切的話題,但他們沒有工作(僅純色出現或整個地圖呈黑色) 。

那麼,是否有可能只爲第一個「四邊形」(2個三角形)創建一個數組,然後通過例如增加索引來紋理整個地圖?如果是,我該怎麼做。 還有一個問題:我如何在整個地圖上放置1個紋理,並在地形上進行縮放。

我可以用一個四邊形或一個帶有兩個三角形的三角形條做它們,但不能用於〜3 000 000個三角形。

主要的問題是索引,因爲如果我是對的,它不僅繪製基於索引的頂點位置,還繪製顏色和紋理座標。

我的地圖:http://kepfeltoltes.hu/view/130827/1094341850Untitled_www.kepfeltoltes.hu_.png 我知道它是一個非常「過度」的問題,但我仍然沒有找到正確的方法。 編輯:我想瓷磚紋理。

回答

1

我將做如下假設(可適當放寬,但你會明白我的意思)你目和質地:

  • 他們都是方形
  • 網的範圍在x和z範圍從0到TERRAIN_WIDTH(這是一些正整數,包括)。

如果上述假設成立,你的紋理座標的一些地表的頂點網

V =(v_x,v_y,v_z)

簡直是

texcoord =(v_x/TERRAIN_WIDTH,v_z/TERRAIN_WIDTH)

這個texcoord被傳遞給你的片段着色器並用於紋理查找。您可以使用const值或更好的統一值直接在頂點着色器內生成此texcoord。

uniform float TERRAIN_WIDTH; // or a less flexible const float TERRAIN_WIDTH; 
uniform mat4 ModelViewProjection; 

in vec4 Position; // x and z assumed to be in 0 .. TERRAIN_WIDTH (inclusive) 

out vec2 TexCoord; 

void main() 
{ 
    TexCoord = Position.xz/TERRAIN_WIDTH: 
    gl_Position = ModelViewProjection * Position; 
} 

警告:未經測試的代碼!

編輯:關於平鋪:以上依然成立。但是,TERRAIN_WIDTH應該替換爲TILE_WIDTH之類的東西。我仍然假設一個整體正方形網格和正方形瓷磚。

例如,如果你地形具有的尺寸256×256,並且由4個瓷磚尺寸128×128,在texcoords用於頂點(240,0,240)被計算爲:

texcoord =(240/TILE_WIDTH,240/TILE_WIDTH)=(240/128,240/128)=(1.875,1.875)

使用GL_REPEAT作爲TEXTURE_WRAP_S和TEXTURE_WRAP_T模式(默認值),整數部分(即1)將被忽略和最終的texcoord是(0.875,0.875)。你可以看到,這又是在[0,1]中,並且將針對(112,0,112)查找與(240,0,240)相同的紋理元素。因此,您可以使用相同的紋理獲得拼貼效果。

注意:爲了使拼貼在視覺上工作,您的紋理也需要平鋪,否則錯覺會逐字地在接縫處爆裂。 ;)

+0

你的天才!:D我從來沒有想過我必須在着色器中計算texcoords,但它的工作原理!甚至我不必添加另一個vbo,數組或向量。非常感謝!:D –

+0

http://kepfeltoltes.hu/view/130827/726256227Untitled2_www.kepfeltoltes.hu_.png再次感謝再見!;) –

+0

您不必。你可以在Blender等DCC工具中模擬你的地形,在那裏生成UV,導出UV,將它們加載到你的位置並直接從緩衝對象中獲取它們。啊,順便說一句,我敢肯定,不是天才。 ;) – thokra