有谁使用过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!");}
}
}
...全文
302 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
  • 打赏
  • 举报
回复
程序一贴上来就没了缩进,真是不爽!
考虑不确定性的含集群电动汽车并网型微电网随机优化调度研究(Matlab代码实现)内容概要:本文围绕“考虑不确定性的含集群电动汽车并网型微电网随机优化调度研究”展开,利用Matlab代码实现对微电网系统中电动汽车集群接入带来的不确定性进行建模与优化调度。研究重点在于构建能够应对源荷双重不确定性的随机优化模型,通过引入概率分布和场景生成方法处理风电、光伏及电动汽车充电行为的随机性,并采用先进的智能优化算法求解,实现微电网运行成本最小化与供电可靠性的平衡。文中详细阐述了模型构建、不确定性处理、求解算法及仿真验证全过程,提供了完整的代码实现方案,具有较强的工程应用价值。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事微电网、电动汽车、能源优化等相关领域的工程技术人员。; 使用场景及目标:①用于学习和掌握含高比例可再生能源与电动汽车接入的微电网优化调度建模方法;②理解随机优化、场景生成与削减、不确定性建模等关键技术在能源系统中的实际应用;③通过复现代码深入理解优化算法在电力系统调度中的实现过程,支撑科研项目开发与论文写作。; 阅读建议:建议读者结合Matlab代码逐模块分析模型实现细节,重点关注不确定性建模与优化求解部分,可尝试修改参数或引入新的约束条件进行扩展实验,以加深对微电网调度机制的理解。
内容概要:该文档为基于Google Earth Engine(GEE)平台的土壤侵蚀评估工具代码,实现了利用RUSLE(修正通用土壤流失方程)模型计算区域土壤流失量的完整流程。代码涵盖了从地理空间数据加载(如降水、土地覆盖、数字高程模型、土壤属性等)、各RUSLE因子(R、K、L、S、C、P)的逐项计算,到最终土壤流失量估算及可视化展示的全过程。其中集成了多种遥感数据源(CHIRPS降水、MODIS土地覆盖、Landsat 8影像、OpenLandMap土壤数据等),并采用Python调用GEE API完成大规模地理空间分析与处理。此外,还提供了地图可视化与结果导出功能,支持区域生态退化评估与水土保持研究。; 适合人群:具备Python编程基础与地理信息系统(GIS)知识,从事环境科学、生态学、水土保持或遥感应用研究的科研人员及研究生;熟悉GEE平台操作者更佳; 使用场景及目标:①开展区域尺度土壤侵蚀强度评估与空间分布制图;②理解RUSLE模型在遥感与GIS环境下的实现方法;③构建自动化水土流失监测系统的技术参考; 阅读建议:此资源以函数模块化方式组织,建议结合Earth Engine平台实际运行调试,逐步理解各因子计算逻辑,并可根据具体研究区调整参数(如行政边界、时间范围、P因子赋值等)以适应本地化应用。

13,874

社区成员

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

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