我有这种方法准备posCoords数组中的坐标。它大约30%的时间正常工作,然后前70个三角形中的另外70%被网格弄乱了。
使用GL_TRIANGLE_STRIP绘制整个网格。
我正在拔头发试图找出问题所在。有任何想法吗?
if(!ES2) {
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
}
int cols = floor(SCREEN_WIDTH/blockSize);
int rows = floor(SCREEN_HEIGHT/blockSize);
int cells = cols*rows;
NSLog(@"Cells: %i", cells);
coordCount = /*Points per coordinate*/2 * /*Coordinates per cell*/ 2 * cells + /* additional coord per row */2*2*rows;
NSLog(@"Coord count: %i", coordCount);
if(texCoords) free(texCoords);
if(posCoords) free(posCoords);
if(dposCoords) free(dposCoords);
texCoords = malloc(sizeof(GLfloat)*coordCount);
posCoords = malloc(sizeof(GLfloat)*coordCount);
dposCoords = malloc(sizeof(GLfloat)*coordCount);
int index = 0;
float lowY, hiY = 0;
int x,y = 0;
BOOL drawLeftToRight = YES;
for(y=0;y<SCREEN_HEIGHT;y+=blockSize) {
lowY = y;
hiY = y + blockSize;
// Draw a single row
for(x=0;x<=SCREEN_WIDTH;x+=blockSize) {
CGFloat px,py,px2,py2 = 0;
// Top point of triangle
if(drawLeftToRight) {
px = x;
py = lowY;
// Bottom point of triangle
px2 = x;
py2 = hiY;
}
else {
px = SCREEN_WIDTH-x;
py = lowY;
// Bottom point of triangle
px2 = SCREEN_WIDTH-x;
py2 = hiY;
}
// Top point of triangle
posCoords[index] = px;
posCoords[index+1] = py;
// Bottom point of triangle
posCoords[index+2] = px2;
posCoords[index+3] = py2;
texCoords[index] = px/SCREEN_WIDTH;
texCoords[index+1] = py/SCREEN_HEIGHT;
texCoords[index+2] = px2/SCREEN_WIDTH;
texCoords[index+3] = py2/SCREEN_HEIGHT;
index+=4;
}
drawLeftToRight = !drawLeftToRight;
}
最佳答案
使用三角形带,您添加的最后一个顶点将替换所使用的最旧的顶点,因此您沿边缘使用的顶点不正确。用您的图纸更容易解释。
三角形1使用顶点1、2、3-有效三角形
三角形2使用顶点2、3、4-有效三角形
三角形3使用顶点4,5,6-有效三角形
三角形4使用顶点5、6、7-直线,将不会绘制任何内容
三角形5使用顶点6、7、8-有效
等等
如果要使条带工作,则需要用退化的三角形填充条带或将条带破碎。
关于objective-c - GL_TRIANGLE_STRIP和顶点数组出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9493641/