基于索引的纹理高度贴图(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,并在每行的循环中绘制元素。现在我使用它与基于高度的单个着色器着色,但我希望它与纹理相结合(也基于高度,但仍然不是我的问题)

我想把纹理放在两个三角形上形成一个四边形,

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)纹素。因此,您可以使用相同的纹理来获得平铺效果。

注意:为了在视觉上平铺,你的纹理也需要平铺,否则幻觉会在接缝处破裂。)

相关内容

  • 没有找到相关文章

最新更新