我刚刚完成了高度图,每行用三角形条进行渲染。我的解决方案是:
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,并在每行的循环中绘制元素。现在我使用它与基于高度的单个着色器着色,但我希望它与纹理相结合(也基于高度,但仍然不是我的问题)
我想把纹理放在两个三角形上形成一个四边形,
0,1-1,1
| /|
| / |
|/ |
0,0-1,0
但我真的不知道如何实现它,我已经阅读了所有关于它的主题,但它们都不起作用(只有纯色出现,或者整个地图都是黑色的)。
那么,是否可以只为第一个"四边形"(2个三角形)制作一个数组,并通过增加索引等方式对整个地图进行纹理处理?如果是,我该怎么做。还有一个问题:如何在整个地图上放置1个纹理,并在地形上缩放。
我可以用一个四边形或一个有两个三角形的三角形带来做,但不是3000 000个三角形。
主要的问题是索引,因为如果我是对的,它不仅基于索引绘制垂直位置,还基于颜色和纹理坐标。
我的地图:http://kepfeltoltes.hu/view/130827/1094341850Untitled_www.kepfeltoltes.hu_.png我知道这是一个很"夸张"的问题,但我仍然没有找到正确的方法。编辑:我想平铺纹理。
我将对你的网格和纹理做出以下假设(可以放松,但你会得到我的漂移):
- 它们都是方形的
- 网格在x和z中的范围从0到TERAIN_WIDTH(包括正整数)
如果以上假设成立,则地形网格的某个顶点的纹理坐标
v=(v_x,v_y,v_z)
只是
texcord=(v_x/TERRAIN_WADTH,v_z/TERRAIN_WIDTH)
此texcord将传递给片段着色器并用于纹理查找。可以使用常量值或更好的统一值直接在顶点着色器内部生成此texcord。
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。我仍然假设整体为方形网格和方形瓷砖。
例如,如果地形的尺寸为256x256,并且由4个尺寸为128x128的瓦片组成,则(240,0240)处顶点的纹理坐标计算为:
texcord=(240/TILE_WITH,240/TILE_VITH)=(240/128200/128)=(1.875,1.875)
使用GL_REPEAT作为TEXTURE_WAP_S和TEXTURE_WRAP_T模式(默认模式),将简单地忽略整数部分(即1),得到的texcord为(0.875,0.875)
您可以看到,这再次出现在[0,1]中,并且将查找与(112,0112)相同的(240,0240)纹素。因此,您可以使用相同的纹理来获得平铺效果。
注意:为了在视觉上平铺,你的纹理也需要平铺,否则幻觉会在接缝处破裂。)