OpenGL GL_TRIANGLE_STRIP创建具有退化三角形的网格/用于一次绘制调用

我需要创建一个网格准备GL_TRIANGLE_STRIP与一个 drawcall渲染 – 所以我需要退化的三角形。

我几乎在那里,但失去了最后一行/列,不知道为什么。

我的网格只是一个:

  • 职位(自我解释)
  • 大小(x,y大小)
  • 分辨率(x,y中每个顶点之间的间距)

这里是用来创建verts / index并返回它们的方法:

int iCols = vSize.x / vResolution.x; int iRows = vSize.y / vResolution.y; // Create Vertices for(int y = 0; y <= iRows; y ++) { for(int x = 0; x <= iCols; x ++) { float startu = (float)x / (float)vSize.x; float startv = (float)y / (float)vSize.y; tControlVertex.Color = vColor; tControlVertex.Position = CVector3(x * vResolution.x,y * vResolution.y,0); tControlVertex.TexCoord = CVector2(startu, startv - 1.0 ); vMeshVertices.push_back(tControlVertex); } } // Create Indices rIndices.clear(); for (int r = 0; r < iRows - 1; r++) { rIndices.push_back(r*iCols); for (int c = 0; c < iCols; c++) { rIndices.push_back(r*iCols+c); rIndices.push_back((r+1)*iCols+c); } rIndices.push_back((r + 1) * iCols + (iCols - 1)); } 

并且想象一下,首先几个例子。

1)大小512×512分辨率64×64,所以它应该由8 x 8四边形,但我只得到7×7

2)大小512×512分辨率128×128,所以它应该由4 x 4四边形,但我只得到3×3

3)尺寸128×128分辨率8×8所以它应该由16 x 16四边形,但我只得到15×15

正如你所看到的,我错过了最后一行和最后一列。 我哪里错了?

如果iCols为10,则创建11个水平顶点:

 for(int x = 0; x <= iCols; x ++) 

创建索引的最后一列时,请执行以下操作:

 rIndices.push_back((r + 1) * iCols + (iCols - 1)); 

我们可以忽略第一部分,只集中在一行:

 rIndices.push_back(iCols - 1); 

(iCols – 1)将是9,所以它不会解决最后一个顶点(10)。 我认为要解决与列应删除-1的问题。

解决行数变化的问题

 (int r = 0; r < iRows - 1; r++) 

 (int r = 0; r < iRows; r++) 

因为y <= iRows; 而r <iRows – 1是两个,但是应该只有一个垂直顶点比有多个行。

好的,我已经解决了这个问题。 我想我们都变老了,这就是为什么我们不能发现它。

这里是代码:

  // Create Vertices // Notice <= to create exactly as many vertices in X and Y as required for(int y = 0; y <= iRows ; y++) { for(int x = 0; x <= iCols; x++) { float u = (float)x / (float)vSize.x; float v = (float)y / (float)vSize.y; tControlVertex.Color = vColor; tControlVertex.Position = CVector3(x * vResolution.x, y * vResolution.y,0); tControlVertex.TexCoord = CVector2(u, v - 1.0 ); vMeshVertices.push_back(tControlVertex); } } // Create Indices rIndices.clear(); // Create Indices with degenerate triangles ( stitching ) // Notice < iRows, <= iCols for (int y = 0; y < iRows; y++) { // Degenerate first triangle in this column rIndices.push_back((unsigned short)((y + 0) * (iCols+1) + 0)); for (int x = 0; x < iCols + 1; x++) { // Vertex in actual row rIndices.push_back((unsigned short)((y + 0) * (iCols+1) + x)); // Vertex row below rIndices.push_back((unsigned short)((y + 1) * (iCols+1) + x)); } // Degenerate last triangle in this column rIndices.push_back((unsigned short)((y + 0) * (iCols+1) + iCols+1)); } 

结果是:

分辨率为64×64的512×512(称为步进)产生8 * 64 x 8 * 64 = 512×512。

在这里输入图像描述

感谢CiscoIPPhone的调查。