2010-03-28 2 views
2

я делаю следующее:Поврежденный изображение, если переменная не является статичным

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?

ответ

3

Причина, по которой вы видите странные результаты, состоит в том, что вы не рисуете то, что считаете себя.

glDrawArrays(GL_TRIANGLES, 0, 9); 

Это означает, что нарисовать 9 вершин, следовательно, 3 треугольника. У вас есть только 3 вершины, объявленные в вашем массиве, так что другие 2 треугольника в конечном итоге будут догадываться. Во втором изображении вы можете видеть, что у вас действительно есть более одного треугольника ... Данные, которые он использует, все равно находятся в стеке в то время.

glDrawArrays передается по вызову, а я серьезно сомневаюсь, что iPhone не будет соответствовать этому. Это действительно базовый GL, который (я считаю) проверяется на соответствие.

+0

Конечно, вы правы. Извиняюсь, что не заметил этого. Я бы удалил свой ответ, если мог (но это все еще принятый ответ). –

+0

Gah! Какая красная сельдь. Спасибо. –

1

Вы делаете рендеринг неинициализированных данных в и случаях. Это просто выглядит правильно в случае static.

Третий параметр glDrawArrays это число вершин (которые должны быть 3 в вашем случае, потому что вы пытаетесь сделать один треугольник).

Вы уже сказали GL, что вы указываете 3 GLfloat на вершину (первый параметр glVertexPointer). Таким образом, 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); 
Смежные вопросы