2013-08-27 42 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