Opengl: как я могу использовать glIndexPointer для реализации индекса цвета? - PullRequest
2 голосов
/ 27 сентября 2010

У меня есть приложение для отображения двумерных данных MxN со значением данных от 0 до 63. Я показываю это с помощью карты цветов, которая является 64x3. Я хотел бы сделать это так: Подготовьте точки вершин, подготовьте индексный массив, который является значениями данных. Я думаю, что это был бы лучший способ, который имеет как пространство, так и эффективность. Код будет выглядеть так:

 p=colormap_matlab;
 glEnableClientState(GL_VERTEX_ARRAY);
 glEnableClientState(GL_COLOR_ARRAY);
 glEnableClientState(GL_INDEX_ARRAY);
 glVertexPointer(2, GL_INT, 0, vertices);
 glColorPointer(3, GL_FLOAT, 0, p);
 glIndexPointer(GL_UNSIGNED_BYTE,0,color_index);
 int iter = 0;
 int iterP = 0;
 for(i = 0; i < 127; i++)
 {
  iter = 0;
  iterP = 0;
  for(j = 0; j < 1000; j++)
  {
   id1 = (int) data[i*1000+j ];
   id2 = (int) data[(i+1)*1000 + j ];

   color_index[iter++]=id1;
   color_index[iter++]=id2;

   vertices[iterP++] = i;
   vertices[iterP++] = j;
   vertices[iterP++] = i+1;
   vertices[iterP++] = j;

  }

  //glDrawElements(GL_QUAD_STRIP, 999*2, GL_UNSIGNED_INT, indices);
  glDrawArrays(GL_QUAD_STRIP,0,1000*2);
  //glDrawArrays(GL_QUAD_STRIP,500*2,500*2);
 }
 glDisableClientState(GL_VERTEX_ARRAY);
 glDisableClientState(GL_COLOR_ARRAY);
 glDisableClientState(GL_INDEX_ARRAY);

Однако оказывается, что массив указателей индекса не работает вообще. Он просто рисует цвет из цветовой карты последовательно (и вызывает переполнение данных, поскольку цветовая карта только 64x3).

настройка контекста будет выглядеть так:

  CSimple_drawView *pView  = (CSimple_drawView* ) pParam;
   HWND hWnd = (pView)->GetSafeHwnd();  
   HDC  hDC ;
   HGLRC hRC;
   hDC = ::GetDC(hWnd);
   SetupPixelFormat(hDC);
   hRC = wglCreateContext( hDC );
   wglMakeCurrent( hDC, hRC );
   readfile(0);
   init_index();
   init_mesh_index();
   int  i = 0;
   all_threads.SetEvent();
   // end added here 
   int startTime = GetTickCount();
    while(i < 200)
    {
        initialize(hWnd);
        //readfile(0);
        WaitForSingleObject(all_threads.m_hObject, INFINITE);
        glLoadIdentity();
        glClear(GL_COLOR_BUFFER_BIT);
        i++;
        Render4(0,count);
        ++count;
        SwapBuffers(hDC);

    }


BOOL SetupPixelFormat(HDC hDC)
{

    PIXELFORMATDESCRIPTOR pixelDesc=
    {
        sizeof(PIXELFORMATDESCRIPTOR),
        1,
        PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|
        PFD_DOUBLEBUFFER|PFD_SUPPORT_GDI,
        PFD_TYPE_RGBA,
        24,
        0,0,0,0,0,0,
        0,
        0,
        0,
        0,0,0,0,
        32,
        0,
        0,
        PFD_MAIN_PLANE,
        0,
        0,0,0
    };

    int pixelformat;

    if ( (pixelformat = ChoosePixelFormat(hDC, &pixelDesc)) == 0 )
    {
        MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK);
        return FALSE;
    }

    if (SetPixelFormat(hDC, pixelformat, &pixelDesc) == FALSE)
    {
        MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK);
        return FALSE;
    }
    return TRUE;

}

Кто-нибудь может дать мне несколько советов по этому поводу?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2010

Вы должны установить формат пикселей, способный отображать индексированные цвета (см. Документацию PIXELFORMATDESCRIPTOR )

Замените PFD_TYPE_RGBA на PFD_TYPE_COLOR_INDEX.Настройка окна должна следовать операциям рендеринга.

Чтобы указать пользовательскую палитру, вы должны определить ее на уровне диспетчера окон (поскольку вы создаете окно, используя его).Функции SelectPalette и SetPaletteEntries .

0 голосов
/ 27 сентября 2010

Убедитесь, что это не относится к вам:

glEnableClientState(GL_INDEX_ARRAY)

Что не так с этим кодом?

  glBindBuffer(GL_ARRAY_BUFFER, vboid);
  glVertexPointer(3, GL_FLOAT, sizeof(vertex_format), 0);
  glNormalPointer(GL_FLOAT, sizeof(vertex_format), 20);
  glEnableClientState(GL_VERTEX_ARRAY);
  glEnableClientState(GL_NORMAL_ARRAY);
  glEnableClientState(GL_INDEX_ARRAY);
  glBindBuffer(GL_ELEMENT_ARRAY, iboid);
  glDrawRangeElements(....);

Проблема в том, что GL_INDEX_ARRAY не означает, что думает этот программист.GL_INDEX_ARRAY не имеет никакого отношения к индексам для вашего glDrawRangeElements.Это для цветовых индексных массивов.

Никогда не используйте их.Просто используйте массив цветов следующим образом.

  glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(vertex_format), X);
  glEnableClientState(GL_COLOR_ARRAY);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...