有谁使用过OpenGL的pBuffer扩展,望不吝赐教!
我已正确初始化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!");}
}
}