19,468
社区成员
发帖
与我相关
我的任务
分享
//截屏并产生纹理
void CDialogGLDlg::Screen(char *filename)
{
int Width = 512;
int Height = 512;
//获取当前设备
HWND hwnd = GetSafeHwnd();
HDC hDC = ::GetDC(hwnd);
CDC *pDC;//窗口DC
pDC = CDC::FromHandle(hDC);
CDC memDC;//内存DC
memDC.CreateCompatibleDC(pDC);
HDC memoryDC = CreateCompatibleDC(hDC);
CBitmap memBitmap, *oldmemBitmap;//建立和屏幕兼容的bitmap
memBitmap.CreateCompatibleBitmap(pDC, Width, Height);
oldmemBitmap = memDC.SelectObject(&memBitmap);//将memBitmap选入内存DC
memDC.BitBlt(0, 0, Width, Height, pDC, 0, 0, SRCCOPY);
BITMAP bmp;
memBitmap.GetBitmap(&bmp);//获得位图信息
//加载图片并获取其位图句柄
//BITMAP bmp;
//HBITMAP hBitmap=(HBITMAP)LoadImage( NULL , filename , IMAGE_BITMAP, 0 , 0 , LR_CREATEDIBSECTION | LR_LOADFROMFILE );
//if(hBitmap == NULL)
//{
// MessageBox("Failed");
//}
//GetObject(hBitmap,sizeof(BITMAP),&bmp);
glGenTextures(1, &texture[0]); // 生成对象名,存放在texture[0]中
glBindTexture(GL_TEXTURE_2D, texture[0]); //创建纹理对象
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); //双线性采样滤波方式
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0 , 3, bmp.bmWidth, bmp.bmHeight,
0 ,GL_RGB , GL_UNSIGNED_BYTE, bmp.bmBits);
//DeleteObject(hBitmap);
memDC.DeleteDC();
ReleaseDC(pDC);
memBitmap.DeleteObject();
oldmemBitmap->DeleteObject();
}
//纹理的绑定和设置
void CDialogGLDlg::RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f,0.0f); glVertex3f(-30.0f,-30.0f,-50.0f);
glTexCoord2f(1.0f,0.0f); glVertex3f(30.0f,-30.0f,-50.0f);
glTexCoord2f(1.0f,1.0f); glVertex3f(30.0f,30.0f,-50.0f);
glTexCoord2f(0.0f,1.0f); glVertex3f(-30.0f,30.0f,-50.0f);
glEnd();
::glCallList(1);
glPopMatrix();
}