Преобразование примитивов OpenGL в OpenGLES - PullRequest
1 голос
/ 24 февраля 2009

Я пытаюсь преобразовать следующий код из спецификации OpenGL 1.5. к спецификации OpenGLES 1.1

(num_x and num_y are passed into the function by arguments)

::glBegin(GL_LINES);
for (int i=-num_x; i<=num_x; i++) 
{
    glVertex3i(i, 0, -num_y);
    glVertex3i(i, 0,  num_y); 
}

for (int i=-num_y; i<=num_y; i++) 
{
    glVertex3i(-num_x, 0, i);
    glVertex3i( num_x, 0, i);
}

::glEnd();

Вот мой соответствующий преобразованный код: (игнорируйте неэффективность моих циклов, сначала я пытаюсь заставить преобразование работать должным образом)

Я пытаюсь построить две вещи здесь:

  • Массив с плавающей точкой всех координат x, y, z, необходимых для рисования сетки
  • Индексный массив всех необходимых вершин.
  • Затем оба массива передаются в OpenGL, который их отображает.

Пример того, как должны выглядеть массивы:

GLshort indices[] = {3, 0, 1, 2, 
                     3, 3, 4, 5, 
                     3, 6, 7, 8, };
GLfloat vertexs[] = {3.0f, 0.0f, 0.0f,
                     6.0f, 0.0f, -0.5f ,
                     0,    0,     0,
                     6.0f, 0.0f,  0.5f,
                     3.0f, 0.0f,  0.0f,
                     0,    0,     0,
                     3,    0,     0,
                     0,    0,     0,
                     0,    6,     0};


int iNumOfVerticies = (num_x + num_y)*4*3;
int iNumOfIndicies = (iNumOfVerticies/3)*4;

GLshort* verticies = new short[iNumOfVerticies];
GLshort* indicies = new short[iNumOfIndicies];
int j = 0;
for(int i=-num_x; j < iNumOfVerticies &&  i<=num_x; i++,j+=6)
{
    verticies[j] = i;
    verticies[j+1] = 0;
    verticies[j+2] = -num_y;

    verticies[j+3] = i;
    verticies[j+4] = 0;
    verticies[j+5] = num_y;
 }

 for(int i=-num_y; j < iNumOfVerticies && i<=num_y;i++,j+=6)
 {
     verticies[j] = i;
     verticies[j+1] = 0;
     verticies[j+2] = -num_x;

     verticies[j+3] = i;
     verticies[j+4] = 0;
     verticies[j+5] = num_x;
 }

Мне нужно также создать массив, если указатели передать. Я «позаимствовал» структуру массива из примера «чайника» на iphone.

В каждом ряду у нас есть число признаков, за которыми следуют ссылки.

 int k = 0;
 for(j = 0; j < iNumOfIndicies; j++)
 {
      if (j%4==0)
      {
         indicies[j] = 3;
      }
      else
      {
         indicies[j] = k++;
      }

 }
 ::glEnableClientState(GL_VERTEX_ARRAY);
 ::glVertexPointer(3 ,GL_FLOAT, 0, verticies);

 for(int i = 0; i < iNumOfIndicies;i += indicies[i] + 1)
 {
       ::glDrawElements(  GL_LINES, indicies[i], GL_UNSIGNED_SHORT, &indicies[i+1] );
 }

 delete [] verticies;
 delete [] indicies;

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

1 Ответ

1 голос
/ 04 марта 2009

Я могу видеть несколько вещей не так с вашим преобразованным кодом:

1.- Используя неправильный тип для переменной verticies , оно должно быть:

GLfloat* verticies = new float[iNumOfVerticies];

2.- Неправильное заполнение вершин , второй цикл должен быть:

for(int i=-num_y; j < iNumOfVerticies && i<=num_y;i++,j+=6)
{
    verticies[j] = -num_x;
    verticies[j+1] = 0;
    verticies[j+2] = i;

    verticies[j+3] = num_x;
    verticies[j+4] = 0;
    verticies[j+5] = i;
}

3.- Неправильное заполнение указывает , думаю, вам следует удалить строки:

if (j%4==0)
{
     indicies[j] = 3;
}
else

4.- Неправильное использование glDrawElements , замените цикл одной строкой:

::glDrawElements(  GL_LINES, iNumOfIndicies, GL_UNSIGNED_SHORT, indicies);
...