我有一个应用程序来显示数据值为0-63的2D数据MxN。我正在使用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);
然而,事实证明索引指针数组根本不起作用。它只是顺序地从colormap中绘制颜色(并且由于colormap只有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;
}
任何人都可以给我一些提示吗?
答案 0 :(得分:0)
您应该设置一种能够显示索引颜色的像素格式(请参阅PIXELFORMATDESCRIPTOR 的文档)
用PFD_TYPE_COLOR_INDEX替换PFD_TYPE_RGBA。窗口设置应遵循渲染操作。
要指定自定义调色板,您必须在窗口管理器级别定义它(因为您使用它创建窗口)。功能是SelectPalette和SetPaletteEntries。
答案 1 :(得分:-1)
确保this不适用于您:
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);