基于索引的纹理高度贴图(OpenGL/GLSL)

基于索引的纹理高度贴图(OpenGL/GLSL),opengl,indexing,textures,glsl,gl-triangle-strip,Opengl,Indexing,Textures,Glsl,Gl Triangle Strip,我刚刚完成高度贴图,每行用三角形条渲染。我的解决办法是: 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

我刚刚完成高度贴图,每行用三角形条渲染。我的解决办法是:

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);
    }
   }
…但我真的不知道如何实现它,我已经阅读了所有关于此的主题,但它们都不起作用(只显示纯色或整个地图为黑色)

那么,是否有可能只为第一个“四边形”(2个三角形)创建一个数组,并通过增加索引等方式对整个地图进行纹理处理?如果是,我怎么做。 还有一个问题:我如何在整个地图上放置一个纹理,并在地形上缩放它

我可以用一个四边形或两个三角形的三角形带来做,但不能用300000个三角形

主要的问题是索引,因为如果我是对的,它不仅基于索引绘制垂直位置,还基于颜色和纹理坐标

我的地图: 我知道这是一个相当“过分”的问题,但我仍然没有找到正确的方法。
编辑:我想平铺纹理。

我将对网格和纹理做出以下假设(可以放松,但你会明白我的意思):

  • 它们都是方形的
  • 网格在x和z方向的范围从0到地形宽度(包括正整数)
如果上述假设成立,则将为地形网格的某些顶点创建纹理坐标

v=(v_x,v_y,v_z)

只是

texcoord=(v_x/地形宽度,v_z/地形宽度)

此texcoord将传递给片段着色器并用于纹理查找。您可以直接在顶点着色器内使用常量值或更好的统一值生成此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;
}
警告:未测试的代码

编辑:关于平铺:上述内容仍然有效。但是,地形宽度应替换为瓷砖宽度。我仍然假设整体为方形网格和方形瓷砖

例如,如果地形的尺寸为256x256,并且由4个尺寸为128x128的平铺组成,则(240,0,240)处顶点的纹理坐标计算为:

texcoord=(240/瓷砖宽度,240/瓷砖宽度)=(240/128,240/128)=(1.875,1.875)

使用GL_REPEAT作为纹理包裹和纹理包裹模式(默认),整数部分(即1)将被忽略,生成的texcoord为(0.875,0.875)

您可以看到,这也是在[0,1]中,并且将查找(240,0240)与(112,0112)相同的texel。因此,您可以使用相同的纹理获得平铺效果


注意:为了使平铺在视觉上起作用,您的纹理也需要平铺,否则,接缝处的错觉就会破裂。;)

你是个天才我从来没有想过我必须在着色器中计算texcoords,但它是有效的!!!甚至我也不需要再添加一个vbo、数组或向量。谢谢!:再次谢谢你,再见你不必这么做。您也可以在一些DCC工具(如Blender)中对地形建模,在那里生成UV,导出UV,将它们加载到您的位置旁边,并直接从缓冲区对象生成它们。啊,顺便说一句,我肯定他不是天才
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;
}