如果变量不是静态的,则损坏图像

时间:2010-03-28 18:12:46

标签: iphone opengl-es

我正在做以下事情:

static GLfloat vertices[3][3] = 
{    
    {0.0, 1.0, 0.0},
    {1.0, 0.0, 0.0},
    {-1.0, 0.0, 0.0}
};

glColor4ub(255, 0, 0, 255);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLES, 0, 9);
glDisableClientState(GL_VERTEX_ARRAY);

这样可行:

http://dl.dropbox.com/u/41764/posts/Screen%20shot%202010-03-28%20at%2020.04.56.png

但是,如果我从顶点删除static并因此在每次渲染时在堆栈上重新创建数据,我会得到以下内容:

http://dl.dropbox.com/u/41764/posts/Screen%20shot%202010-03-28%20at%2020.06.38.png

在模拟器和设备上都会发生这种情况。

我打电话给glDrawArrays后,我应该保留变量吗?

2 个答案:

答案 0 :(得分:3)

你看到奇怪结果的原因是因为你没有画出你认为的那样。

glDrawArrays(GL_TRIANGLES, 0, 9);

这意味着绘制9个顶点,因此绘制3个三角形。你的数组中只有3个顶点,所以其他2个三角形最终会被猜测。你可以在第二张图片中看到你确实有超过1个三角形...它最终使用的数据是当时堆栈上的其他内容。

glDrawArrays会在通话时转接,我认真地怀疑iPhone不符合此要求。这是非常基本的GL,(我相信)会进行一致性测试。

答案 1 :(得分:1)

您正在两个案例中呈现未初始化的数据。恰好在static案例中看起来是正确的。

glDrawArrays的第三个参数是顶点的数量(在您的情况下应为3,因为您试图绘制一个三角形。)

你已经告诉GL你要为每个顶点指定3 GLfloatglVertexPointer的第一个参数)。因此GL可以计算出预期的GLfloat总数。

这应该有效:

GLfloat vertices[3][3] = 
{    
    {0.0, 1.0, 0.0},
    {1.0, 0.0, 0.0},
    {-1.0, 0.0, 0.0}
};

glColor4ub(255, 0, 0, 255);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableClientState(GL_VERTEX_ARRAY);