这个算opengl的bug还是我的程序的问题?

capriccioo 2009-04-18 11:06:29
用vc2008新建一个MFC的单文档程序,
在view的OnDraw函数中写入如下代码:
static bool first_draw = true;
if(first_draw)
{
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
1, // version number
PFD_DRAW_TO_WINDOW | // support window
PFD_SUPPORT_OPENGL | // support OpenGL
PFD_DOUBLEBUFFER, // double buffered
PFD_TYPE_RGBA, // RGBA type
24, // 24-bit color depth
0, 0, 0, 0, 0, 0, // color bits ignored
0, // no alpha buffer
0, // shift bit ignored
0, // no accumulation buffer
0, 0, 0, 0, // accum bits ignored
32, // 32-bit z-buffer
0, // no stencil buffer
0, // no auxiliary buffer
PFD_MAIN_PLANE, // main layer
0, // reserved
0, 0, 0 // layer masks ignored
};
int iPixelFormat;
iPixelFormat = ChoosePixelFormat(*pDC, &pfd);
SetPixelFormat(*pDC, iPixelFormat, &pfd);

hglrc=wglCreateContext(*pDC);

glShadeModel(GL_FLAT);
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
first_draw=false;
}
GetClientRect(&wholerect);
wglMakeCurrent (*pDC, hglrc);
glClear(GL_COLOR_BUFFER_BIT);

int m=221;
int n=900;
unsigned char * img=new unsigned char[m*n];
for(int i=0;i<m*n;++i)
{
img[i]=100;
}
glRasterPos2f(-1,-1);
glPixelZoom((GLfloat)(wholerect.Width())/(GLfloat)(m),
(GLfloat)(wholerect.Height())/(GLfloat)(n));
glDrawPixels(m,n,GL_LUMINANCE,GL_UNSIGNED_BYTE,img);

glFlush();
SwapBuffers(*pDC);

delete [] img;

这样程序运行后整个窗口应该都是灰色的,但实际上最上面的一条(宽度不定)是乱的。
如果把m的值改为220,就没有问题了。当m为不同的值的时候,有可能会出现这种状况,也
可能没有异常。
我在不同的电脑上都试过了,都是这样。包括nvidia的显卡和intel的显卡。
会是哪里出了问题啊?
...全文
108 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
heartofmaple 2009-04-20
  • 打赏
  • 举报
回复
刚试了下,宽度只要是4的倍数显示就没有问题。应该是glDrawPixels将宽度补全为4的倍数,然后绘制,再截回原来的宽度,你可以试试申请空间时将宽度补全为4的倍数,然后在glDrawPixels中宽度取原先的值,这样绘制出来就应该没错了。
capriccioo 2009-04-20
  • 打赏
  • 举报
回复
问题是好像连16这么吉利的数字都会出问题。。。
heartofmaple 2009-04-20
  • 打赏
  • 举报
回复
宽度必须是4的倍数吧,要不然显示会有问题的.

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧