matlab将使用软件opengl,如何在Windows上使用OpenGL在同一应用程序内绘制两个单独的3D窗口?...

您没有发布由wglMakeCurrent()生成的错误代码,所以我不会猜测原因。然而,这不是绑定本身。句子“一个线程可以有一个当前的渲染上下文”意味着,新的上下文将'替换'旧的并成为当前的。我不知道你为什么要设置两个上下文作为当前(或运行另一个线程),但它不是要走的路。除非绝对必要,否则不要在渲染中使用多线程。 所以,回答你的问题:

是的,你CAN'重用'OpenGL渲染上下文。

为什么,你可能会问?为特定的设备上下文(HDC)创建渲染上下文,这是每个窗口(HWND)的专有属性!这怎么可能呢?

嗯,这看起来有点不可能的,因为函数原型:

HWND my_window = CreateWindow(...);

HDC my_dc = GetDC(my_new_window);

//Setup pixel format for 'my_dc'...

HGLRC my_rc = wglCreateContext(my_dc);

wglMakeCurrent(my_dc, my_rc);

这真的让你认为渲染上下文被绑定到这个特定的设备上下文,只为它有效。但事实并非如此。 关键部分是评论(设置像素格式)。渲染上下文是为特定的DC类创建的,更确切地说:对于具有相同像素格式的DC。所以下面的代码是完全合法:

//window_1 = main window, window_2 = your window

HDC dc_1 = GetDC(window_1);

Set_pixel_format_for_dc_1(); //Usual stuff

HGLRC rc = wglCreateContext(dc_1);

wglMakeCurrent(dc_1, rc);

ultra_super_draw();

//.....

HDC dc_2 = GetDC(window_2);

//Get dc_1's PF to make sure it's compatible with rc.

int pf_index = GetPixelFormat(dc_1);

PIXELFORMATDESCRIPTOR pfd;

ZeroMemory(&pfd, sizeof(PIXELFORMATDESCRIPTOR));

DescribePixelFormat(dc_1, pf_index, sizeof(PIXELFORMATDESCRIPTOR), &pfd);

SetPixelFormat(dc_2, pf_index, &pfd);

wglMakeCurrent(dc_2, rc);

another_awesome_render();

wglMakeCurrent(NULL, NULL);

如果你仍然不服气,MSDN:

wglMakeCurrent(HDC,hglrc):的HDC参数必须是指一个绘图表面通过支持OpenGL 。它不需要与创建hglrc时传递给wglCreateContext的hdc相同,但它必须位于同一设备上且具有相同的像素格式。

我猜你已经熟悉了这些调用。现在,我不知道什么是你的渲染必须满足的条件,但没有额外的要求,我没有看到这一点任何困难:

HDC my_dc = Create_my_DC();

//...

void my_new_render

{

//Probably you want to save current binding:

HDC current_dc = wglGetCurrentDC();

HGLRC current_context = wglGetCurrentContext();

wglMakeCurrent(my_dc, current_context);

MyUltraSuperRender(...);

wglMakeCurrent(current_dc, current_context);

}

希望这有助于:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值