Поврежденное изображение, если переменная не является статичной - PullRequest
2 голосов
/ 28 марта 2010

Я делаю следующее:

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 ]

3 голосов
/ 28 марта 2010

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

glDrawArrays(GL_TRIANGLES, 0, 9);

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

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

1 голос
/ 29 марта 2010

Вы отображаете неинициализированные данные в обоих случаях. В случае 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...