C++ 使用gl_VertexID计算顶点(网格内)的X和Z位置

C++ 使用gl_VertexID计算顶点(网格内)的X和Z位置,c++,opengl,glsl,C++,Opengl,Glsl,我正在尝试生成3D地形。我的目标是将顶点的高度传递给顶点着色器,并使用gl\u VertexID计算顶点着色器中的x和z位置。顶点在x轴和z轴上相距1。以下是顶点着色器: #版本330核心 均匀mat4投影; 统一mat4视图; 统一mat4世界; 浮动高度中的布局(位置=0); //顶点偏移;顶点相对于正方形左上角的位置 常数vec2偏移量[6]=vec2[]( vec2(0,0),//左上角 vec2(0,1),//左下角 vec2(1,1),//右下角 vec2(1,1),//右下角 ve

我正在尝试生成3D地形。我的目标是将顶点的高度传递给顶点着色器,并使用
gl\u VertexID
计算顶点着色器中的x和z位置。顶点在x轴和z轴上相距1。以下是顶点着色器:

#版本330核心
均匀mat4投影;
统一mat4视图;
统一mat4世界;
浮动高度中的布局(位置=0);
//顶点偏移;顶点相对于正方形左上角的位置
常数vec2偏移量[6]=vec2[](
vec2(0,0),//左上角
vec2(0,1),//左下角
vec2(1,1),//右下角
vec2(1,1),//右下角
vec2(0,0),//左上角
vec2(1,0)//右上角
);
void main(){
//平方指数
整数平方指数=gl_VertexID/6;
//正方形内顶点索引
int vertexIndex=gl_VertexID%6;
//顶点的xz位置
vec2位置=偏移量[vertexIndex]+vec2(平方指数%长度,平方指数/长度);
gl_位置=投影*视图*世界*矢量4(位置x,高度,位置y,1.0f);
}
三角形从左到右、从上到下绘制。以下是EBO的生成过程:

for(unsigned int xSquare = 0; xSquare < LENGTH; xSquare++) {
   for(unsigned int zSquare = 0; zSquare < LENGTH; zSquare++) {
      size_t squareIndex = zSquare * LENGTH + xSquare;
      unsigned int topLeft = squareIndex;
      unsigned int topRight = squareIndex + 1;
      unsigned int bottomLeft = squareIndex + LENGTH;
      unsigned int bottomRight = squareIndex + LENGTH + 1;
      elements[squareIndex] = topLeft;
      elements[squareIndex + 1] = bottomLeft;
      elements[squareIndex + 2] = bottomRight;
      elements[squareIndex + 3] = bottomRight;
      elements[squareIndex + 4] = topLeft;
      elements[squareIndex + 5] = topRight;
   }
}
for(无符号int-xSquare=0;xSquare
我已经使用qrenderdoc检查了顶点数据输入,并且高度被正确地传递到顶点着色器。然而,


我已经检查了顶点着色器逻辑,没有发现任何问题。有人知道我做错了什么吗?

注意不要混淆索引缓冲区(有时称为元素缓冲区)和顶点缓冲区。请注意,
gl_VertexID
是“顶点索引”,而不是“索引索引索引”。您的着色器只需执行以下操作:

int row = gl_VertexID / LENGTH;
int col = gl_VertexID % LENGTH;
顺便说一下,在构建索引缓冲区时,应该确保每个三角形对的方向一致。现在看起来一个是顺时针的,另一个是逆时针的。玩GL_CULL_FACE,看看这会如何影响事情

这里只是空气编码,但我会这样做:

unsigned int elementIndex=0;
for(无符号整数zSquare=0;zSquare
虽然使用
gl\u VertexID
看起来很聪明,但在顶点缓冲区中简单地包含X和Y是一个更简单的选择,并且如果您希望在地形细分方面更智能(例如,您可能希望在平坦区域中使用更大的三角形),那么在将来更容易扩展代码