OpenGL离屏渲染

文章来源:

深圳市闻道软件工作室

以前写的程序大多是控制台的,很少接触UI相关的东西。OpenGL这样专门用来做3D处理的API更是觉得相当之高大上。
虽然没有什么概念,但是项目中应用到了OPenGl。而为了提升程序效率,我们想将OpenGL的模型先绘制到位图上,再与其它UI一起绘制到屏幕。经过查阅资料,发现这种方式有个通用的名称,叫做离屏渲染(off-screen)。
经过一整天不断的调试,终于掌握了WINAPI下的OpenGL off-screen的方法步骤。

1、创建WINDOWS绘制句柄

HDC father = GetDC(hwnd);
hdc = CreateCompatibleDC(0);
//pBitmap = CreateCompatibleBitmap(hdc,FACE_WIDTH,FACE_HEIGHT);
BITMAPINFO bmi = {
{ sizeof(BITMAPINFOHEADER), FACE_WIDTH, FACE_HEIGHT, 1, 32, BI_RGB, 0, 0, 0, 0, 0 },
{ 0 }
};
DWORD *pbits; // pointer to bitmap bits
pBitmap = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, (void **) &pbits,
0, 0);
SelectObject(hdc,pBitmap);

注意事项:1、必须使用 CreateDIBSection创建位图,CreateCompatibleBitmap创建的位图离屏渲染会失败
2、3D模型的纹理像素不能大于1024*1024K,否则加载纹理会失败
2、转换像素格式
void SetupPixelFormat(HDC hDC) //为设备环境设置像素格式
{
int nPixelFormat; //像素格式变量
static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), //数据结构大小
1, //版本号,总设为1
PFD_DRAW_TO_BITMAP | //支持BITMAP
PFD_SUPPORT_OPENGL,
PFD_TYPE_RGBA, //RGBA颜色模式
32, //32位颜色模式
0, 0, 0, 0, 0, 0, //忽略颜色为,不使用
0, //无alpha缓存
0, //忽略偏移位
0, //无累积缓存
0, 0, 0, 0, //忽略累积位
32, //16位z-buffer(z缓存)大小
0, //无模板缓存
0, //无辅助缓存
PFD_MAIN_PLANE, //主绘制平面
0, //保留的数据项
0, 0, 0 }; //忽略层面掩模
//选择最匹配的像素格式,返回索引值
nPixelFormat = ChoosePixelFormat(hDC, &pfd);
//设置环境设备的像素格式
SetPixelFormat(hDC, nPixelFormat, &pfd);
}
3、创建OpenGL绘图环境
SetupPixelFormat(hdc); //调用像素格式设置函数
hrc = wglCreateContext(hdc); //创建OpenGL绘图环境并创建一个指向OpenGL绘制环境的句柄
wglMakeCurrent(hdc, hrc); //将传递过来的绘制环境设置为OpenGL将要进行绘制的当前绘制

4、渲染

你可能感兴趣的:(OpenGL离屏渲染)