有谁使用过OpenGL的pBuffer扩展,望不吝赐教!

CrazyCPP 2001-10-12 09:09:18
我已正确初始化OpenGL并获取了pBuffer相应的扩展函数,指定了正确的hdc和象素格式,但一调用wglCreatePbufferARB系统就抛出异常,而如果指定错误的象素格式,wglCreatePbufferARB就能正常运行并返回一个NULL,不知何故!源代码如下:

#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
typedef bool (APIENTRY * PFNGLGETPIXELFORMATATTRIBIVARBPROC ) (HDC hdc,int iPixelFormat,int iLayerPlane,UINT nAttributes,const int *piAttributes,int *piValues);
typedef bool (APIENTRY * PFNGLGETPIXELFORMATATTRIBFVARBPROC ) (HDC hdc,int iPixelFormat,int iLayerPlane,UINT nAttributes,const int *piAttributes,float *pfValues);
typedef bool (APIENTRY * PFNGLCHOOSEPIXELFORMATARBPROC ) (HDC hdc,const int *piAttribIList,const float *pfAttribFList,UINT nMaxFormats,int *piFormats,UINT *nNumFormats);
PFNGLGETPIXELFORMATATTRIBIVARBPROC wglGetPixelFormatAttribivARB;
PFNGLGETPIXELFORMATATTRIBFVARBPROC wglGetPixelFormatAttribfvARB;
PFNGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB;

DECLARE_HANDLE(HPBUFFERARB);
typedef HPBUFFERARB (APIENTRY * PFNGLCREATEPBUFFERARBPROC ) (HDC hDC,int iPixelFormat,int iWidth,int iHeight,const int *piAttribList);
typedef HDC (APIENTRY * PFNGLGETPBUFFERDCARBPROC ) (HPBUFFERARB hPbuffer);
typedef int (APIENTRY * PFNGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer,HDC hDC);
typedef bool (APIENTRY * PFNGLDESTROYPBUFFERARBPROC ) (HPBUFFERARB hPbuffer);
typedef bool (APIENTRY * PFNGLQUERYPBUFFERARB ) (HPBUFFERARB hPbuffer,int iAttribute,int *piValue);
extern PACKAGE PFNGLCREATEPBUFFERARBPROC wglCreatePbufferARB;
extern PACKAGE PFNGLGETPBUFFERDCARBPROC wglGetPbufferDCARB;
extern PACKAGE PFNGLRELEASEPBUFFERDCARBPROC wglReleasePbufferDCARB;
extern PACKAGE PFNGLDESTROYPBUFFERARBPROC wglDestroyPbufferARB;
extern PACKAGE PFNGLQUERYPBUFFERARB wglQueryPbufferARB;
void InitOpenGL(void)
{
//初始化OpenGL
WindowDC = GetDC(Handle);
int npf;
PIXELFORMATDESCRIPTOR pfd;
ZeroMemory(&pfd,sizeof(PIXELFORMATDESCRIPTOR));
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA ;
pfd.cColorBits = 32;
pfd.cDepthBits = 16;
pfd.dwLayerMask = PFD_MAIN_PLANE;
if ((npf = ChoosePixelFormat(WindowDC, &pfd)) == 0 || !SetPixelFormat(WindowDC, npf, &pfd))
throw Exception("无法设置 OpenGL 像素格式!");
GLRes = wglCreateContext(WindowDC);
wglMakeCurrent(WindowDC,GLRes);
//像素格式扩展
wglGetPixelFormatAttribivARB= (PFNGLGETPIXELFORMATATTRIBIVARBPROC )wglGetProcAddress("wglGetPixelFormatAttribivARB");
wglGetPixelFormatAttribfvARB= (PFNGLGETPIXELFORMATATTRIBFVARBPROC )wglGetProcAddress("wglGetPixelFormatAttribfvARB");
wglChoosePixelFormatARB = (PFNGLCHOOSEPIXELFORMATARBPROC )wglGetProcAddress("wglChoosePixelFormatARB");
//像素缓冲区扩展
wglCreatePbufferARB = (PFNGLCREATEPBUFFERARBPROC )wglGetProcAddress("wglCreatePbufferARB");
wglGetPbufferDCARB = (PFNGLGETPBUFFERDCARBPROC )wglGetProcAddress("wglGetPbufferDCARB");
wglReleasePbufferDCARB = (PFNGLRELEASEPBUFFERDCARBPROC )wglGetProcAddress("wglReleasePbufferDCARB");
wglDestroyPbufferARB = (PFNGLDESTROYPBUFFERARBPROC )wglGetProcAddress("wglDestroyPbufferARB");
wglQueryPbufferARB = (PFNGLQUERYPBUFFERARB )wglGetProcAddress("wglQueryPbufferARB");
//获取所有的像素格式的总数
int pValues = WGL_NUMBER_PIXEL_FORMATS_ARB
int NumFormat;
wglGetPixelFormatAttribivARB(WindowDC,0,0,1,(const int *)&pValues,&NumFormat);
//循环所有的像素格式来试图生成像素缓冲
for (int PixelFormat=0; PixelFormat<NumFormat; PixelFormat++) {
try {
HPBUFFERARB PBuffer = wglCreatePbufferARB(WindowDC,PixelFormat,256,256,NULL); //此处抛出异常
if (PBuffer != NULL) ShowMessage(AnsiString(PixelFormat) + " Success!");
int Error = GetLastError();
switch (Error) {
case ERROR_INVALID_PIXEL_FORMAT : ShowMessage(AnsiString(PixelFormat) + " Failed!\r\nPixel format is not valid.");break;
case ERROR_NO_SYSTEM_RESOURCES : ShowMessage(AnsiString(PixelFormat) + " Failed!\r\nInsufficient resources exist.");break;
case ERROR_INVALID_DATA : ShowMessage(AnsiString(PixelFormat) + " Failed!\r\n<iWidth> or <iHeight> is negative or zero. Or <piAttribList> is not a valid");break;
}
} catch (...) {ShowMessage(AnsiString(PixelFormat) + " Failed!");}
}
}
...全文
244 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
CrazyCPP 2001-10-15
  • 打赏
  • 举报
回复
我现已解决此问题。
关键是:在ARB委员会接纳Pixel-Buffer扩展之前,他是作为多个厂商支持的Ext扩展存在的,上面的程序完全能运行通过,而我在nVidia、ATi网站上下载的资料、例程均是用Ext写的,wglCreatePbuffer的最后一个参数为NULL,但ARB委员会好像修改了这个标准,认为必须传送有效指针,类型为以0结束的int*,若不需要传递其它值的话,其第一个值应为0,错误就是这样造成的。
kyosuke 2001-10-14
  • 打赏
  • 举报
回复
那里好像比较空。
  • 打赏
  • 举报
回复
转到图形游戏多媒体去试试吧
CrazyCPP 2001-10-12
  • 打赏
  • 举报
回复
up
CrazyCPP 2001-10-12
  • 打赏
  • 举报
回复
up
CrazyCPP 2001-10-12
  • 打赏
  • 举报
回复
程序一贴上来就没了缩进,真是不爽!

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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