0

我正在尝试在 iphone 上制作图像拉伸效果。我制作了一个顶点数组并在背景图像的任意半径内移动每个索引的纹理数据。然后进行以下调用以显示:

int n = gridSize_.x * gridSize_.y;
glEnableClientState( GL_VERTEX_ARRAY);
glEnableClientState( GL_TEXTURE_COORD_ARRAY );
glVertexPointer(3, GL_FLOAT, 0, vertices);
glTexCoordPointer(2, GL_FLOAT, 0, texCoordinates);
glDrawElements(GL_TRIANGLES, n*6, GL_UNSIGNED_SHORT, indices);

//if(num_myindices > 0)
// glDrawElements(GL_TRIANGLES, num_myindices*6, GL_UNSIGNED_SHORT, myindices);
glDisableClientState(GL_VERTEX_ARRAY );
glDisableClientState( GL_TEXTURE_COORD_ARRAY );

我的问题是被拉伸区域的边缘看起来非常不稳定,网格尺寸相对较小,例如 32x32 甚至 64x64。任何更大的都会使它更平滑,但速度要慢得多。

所以我尝试添加背景图像的副本,并将顶点数组限制为仅受影响的索引。我使用更小的网格尺寸,但用于更小的区域。上面的绘图代码现在看起来像:

//glDrawElements(GL_TRIANGLES, n*6, GL_UNSIGNED_SHORT, indices);
if(num_myindices > 0)
glDrawElements(GL_TRIANGLES, num_myindices*6, GL_UNSIGNED_SHORT,myindices);

显示受影响的区域,但背景图像似乎闪烁并消失,我的拉伸区域漂浮在黑色背景上。显然,我的背景首先呈现,然后我上面的代码覆盖并仅呈现我的顶点数组中的数据。

有没有人对如何有效地组合图像的绘图有建议?

我计划为背景制作第二个简单的顶点数组,并在我的 if 语句之前调用 glDrawArray,以便所有绘图都在一个方法中完成。这是解决这个问题的正确方法吗?有没有更好的办法?是否应该以某种方式将所有图像数据组合成 1 个简单的顶点数组?

4

1 回答 1

0

在一组图元上绘制背景。

在靠近相机的第二组图元上绘制“改进”(如果您使用正交投影,那么它会改变一维的值)。

不能说为什么背景闪烁和消失。可能有很多原因。您忘记正确清除 opengl 状态,存在深度冲突或任何其他大量错误。

但是,如果你坚持在不同“平面”上的不同几何图形集上绘制重叠图像,那么你应该得到你想要的效果。

于 2011-08-20T16:06:14.787 回答