SetPixelFormat 出错,请帮忙?

feng007lhf 2009-09-27 05:40:06
各位大侠,我使用Tao opengl 开一个项目,其中要使用opengl的 off-screen(渲染到一张位图)渲染,但是我在搭建opengl context的时候遇到如题的错误, 即我不能设置像素格式,具体代码如下: 其中SetPixelFormat返回FALSE, 使用GetLastError返回1: 表示无效功能或者函数,但是我应该如何做哪?

System.Drawing.Image img = new System.Drawing.Bitmap(width, height);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(img);

CreateGLContext(width, height, 16);

//define CreateGLContext
private bool CreateGLContext (int width, int height, int bits)
{
int pixelFormat;
Gdi.PIXELFORMATDESCRIPTOR pfd = new Gdi.PIXELFORMATDESCRIPTOR ();
pfd.nSize = (short) Marshal.SizeOf ( pfd );
pfd.nVersion = 1;
pfd.dwFlags = Gdi.PFD_DRAW_TO_BITMAP |
Gdi.PFD_SUPPORT_OPENGL |
Gdi.PFD_SUPPORT_GDI;
pfd.iPixelType = (byte) Gdi.PFD_TYPE_RGBA;
pfd.cColorBits = (byte) bits;
pfd.cRedBits = 0;
pfd.cRedShift = 0;
pfd.cGreenBits = 0;
pfd.cGreenShift = 0;
pfd.cBlueBits = 0;
pfd.cBlueShift = 0;
pfd.cAlphaBits = 0;
pfd.cAlphaShift = 0;
pfd.cAccumBits = 0;
pfd.cAccumRedBits = 0;
pfd.cAccumGreenBits = 0;
pfd.cAccumBlueBits = 0;
pfd.cAccumAlphaBits = 0;
pfd.cDepthBits = 16;
pfd.cStencilBits = 0;
pfd.cAuxBuffers = 0;
pfd.iLayerType = (byte) Gdi.PFD_MAIN_PLANE;
pfd.bReserved = 0;
pfd.dwLayerMask = 0;
pfd.dwVisibleMask = 0;
pfd.dwDamageMask = 0;

if ( hDC == IntPtr.Zero )
{
KillGLContext ();
MessageBox.Show ( "Can't Create A GL Device Context.", "ERROR 1",
MessageBoxButtons.OK, MessageBoxIcon.Error );
return false;
}

pixelFormat = Gdi.ChoosePixelFormat ( hDC, ref pfd );
if ( pixelFormat == 0 )
{
KillGLContext ();
MessageBox.Show ( "Can't Find A Suitable PixelFormat.", "ERROR 2",
MessageBoxButtons.OK, MessageBoxIcon.Error );
return false;
}

try
{

if ( !Gdi.SetPixelFormat ( hDC, pixelFormat, ref pfd ) )
{

MessageBox.Show ( Gl.glGetError ().ToString () );
MessageBox.Show ( Marshal.GetLastWin32Error ().ToString () );
KillGLContext ();
MessageBox.Show ( "Can't Set The PixelFormat.", "ERROR 3",
MessageBoxButtons.OK, MessageBoxIcon.Error );
//return false;
}

}
catch ( Exception e )
{
MessageBox.Show ( e.Message );
}

hRC = Wgl.wglCreateContext ( hDC );
if ( hRC == IntPtr.Zero )
{
KillGLContext ();
MessageBox.Show ( "Can't Create A GL Rendering Context.", "ERROR 4",
MessageBoxButtons.OK, MessageBoxIcon.Error );
return false;
}

if ( !Wgl.wglMakeCurrent ( hDC, hRC ) )
{
KillGLContext ();
MessageBox.Show ( "Can't Activate The GL Rendering Context.", "ERROR 5",
MessageBoxButtons.OK, MessageBoxIcon.Error );
return false;
}

ReSizeGLScene ( width, height );

if ( !InitGL () )
{
KillGLContext ();
MessageBox.Show ( "Initialization Failed.", "ERROR 6",
MessageBoxButtons.OK, MessageBoxIcon.Error );
return false;
}
return true;
}

private bool InitGL ()
private void KillGLContext ()

但是我在CSGL中 使用如下代码是可以创建off-screen的渲染环境的,

System.Drawing.Image img = new System.Drawing.Bitmap((int)(pj.ScreenSize.Width), (int)(pj.ScreenSize.Height));
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(img);
GDIGLContext gdictxt = new GDIGLContext(g);//将opengl和Graphics绑定

gdictxt.Create(new DisplayType(DisplayFlags.DRAW_TO_BITMAP, true), null);//创建GDIGLContext容器
gdictxt.Grab();//使该context为当前激活的context.

但是由于我要是用VBO,而 CSGL不支持,或者不知能如何自己产生这些扩展,所以转向了Tao OpenGL, 不过现在我连他的render context都搭建不起来, 有知道的,帮帮我啊,谢谢啦。

...全文
1145 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hxl6983 2011-07-26
  • 打赏
  • 举报
回复
还是楼主靠的是自己呀
xxxxxzelda 2009-11-21
  • 打赏
  • 举报
回复
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
16, // 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
16, // 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
};
feng007lhf 2009-09-29
  • 打赏
  • 举报
回复
问题找到了,原来是我参数设置的不对,具体设置如下:

PIXELFORMATDESCRIPTOR pix;
memset(&pix, 0, sizeof(PIXELFORMATDESCRIPTOR));
pix.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pix.nVersion = 1;

pix.dwFlags |= PFD_DRAW_TO_BITMAP;
pix.dwFlags |= PFD_DRAW_TO_WINDOW;
pix.dwFlags |= PFD_SUPPORT_GDI;
pix.iPixelType = PFD_TYPE_RGBA;
pix.cColorBits = 32;
pix.cRedBits = 8;
pix.cGreenBits = 8;
pix.cBlueBits = 8;
pix.cAlphaBits = 0;
pix.cAccumBits = 64;
pix.cAccumRedBits = 16;
pix.cAccumGreenBits = 16;
pix.cAccumBlueBits = 16;
pix.cAccumAlphaBits = 0;
pix.cDepthBits = 16;
pix.cStencilBits = 8;
pix.cAuxBuffers = 0;
//pix.iLayerType = 0;//(byte)PFD_MAIN_PLANE;
pix.bReserved = 0; // Reserved
pix.dwLayerMask = 0; // Layer Masks Ignored
pix.dwVisibleMask = 0;
pix.dwDamageMask = 0;


不过我还有一个疑问,既然是渲染到bitmap, 为什么还有设置PFD_DRAW_TO_WINDOW ?
ncjcz 2009-09-29
  • 打赏
  • 举报
回复
能弄出来就好了
gisyellow 2009-09-29
  • 打赏
  • 举报
回复
渲染到图片,也是在窗口中绘制啊。。
feng007lhf 2009-09-28
  • 打赏
  • 举报
回复
SetPixelForma() 返回false, 使用GetLastError()返回1, 表示函数不正确,应该如何解决啊
happyboyxq1985 2009-09-28
  • 打赏
  • 举报
回复
帮你顶一下
feng007lhf 2009-09-28
  • 打赏
  • 举报
回复
没有人知道吗,
feng007lhf 2009-09-27
  • 打赏
  • 举报
回复
自己顶一下
内容概要:本文围绕“基于改进秃鹰算法的微电网群经济优化调度”展开研究,利用Matlab代码实现优化算法的仿真与复现。研究重点在于通过改进的秃鹰搜索算法(Bald Eagle Search Algorithm, BESA)解决微电网群在运行过程中的经济调度问题,提升算法的收敛速度与全局寻优能力,以实现对分布式能源、储能系统及负荷的高效协调管理。文中详细阐述了微电网群的系统架构、数学建模过程、目标函数设计(如运行成本最小化、碳排放降低等),并结合智能优化算法进行求解,验证了改进算法相较于传统方法在调度精度和效率方面的优越性。同时,研究还探讨了算法在多场景下的适应性,为微电网群的智能化、低碳化运行提供了技术支持与实践参考。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事微电网、智能优化算法相关工作的工程技术人员。; 使用场景及目标:① 学习并掌握改进秃鹰算法在复杂优化问题中的应用方法;② 实现微电网群经济调度模型的构建与求解;③ 对比不同智能算法在电力系统优化中的性能表现;④ 为科研论文复现、课题研究或工程项目提供算法支持与代码参考。; 阅读建议:建议读者结合文中提供的Matlab代码逐模块分析,重点关注算法改进策略与调度模型的耦合实现方式,同时可尝试在不同参数设置或场景条件下进行仿真实验,以加深对算法性能与调度效果的理解。
内容概要:本文围绕多旋翼无人机姿态估计算法的开发与性能评估展开系统性研究,重点对比了线性与非线性滤波算法在复杂飞行环境下的表现。通过构建基于扩展卡尔曼滤波(EKF)、无迹卡尔曼滤波(UKF)等先进算法的姿态估计器,融合IMU、磁力计、视觉传感器等多源数据,有效提升了姿态解算的精度与鲁棒性。研究涵盖了静态悬停、高速机动及磁干扰等多种典型飞行场景,利用MATLAB/Simulink平台完成仿真实验,并结合实测飞行数据与VICON高精度运动捕捉系统提供的真值进行定量分析。结果表明,非线性滤波器在动态工况下具有显著优势,尤其在抑制漂移和抵抗外部干扰方面优于传统线性方法。文章还提出了传感器融合、自适应建模、冗余配置等一系列降低偏差影响的技术路径,为高可靠性无人机导航系统的设计提供了理论依据与实践指导。; 适合人群:具备控制理论、信号处理及状态估计基础知识,从事无人机导航、控制算法研发或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于开发高精度无人机姿态解算模块;②为多传感器融合算法的设计、实现与验证提供参考案例;③服务于复杂环境下无人系统状态估计的教学演示与科研攻关; 阅读建议:建议结合文中所述MATLAB/Simulink仿真模型与实测数据集进行复现与调试,重点关注EKF与UKF的数学推导、实现细节及关键参数调优过程,深入理解非线性系统建模、状态估计与工程实际之间的平衡与折衷。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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