OpenGL全屏显示2D图片的问题
做了一个简单的程序,只是用OpenGL全屏显示一张2D 1280*1024图片,用的是纹理贴图的方法,但是画面右侧总是空白的。
代码如下
//初始化函数
BOOL CGameApp::Initialize(HINSTANCE hInst, BYTE nID)
{
if(!DealFullScreen()) //设置全屏
return FALSE;
if(!CreateGLWindow()) //创建窗口
return FALSE;
if(!InitOpengl()) //设置OpenGL
return FALSE;
return TRUE;
}
MAIN_WND_WIDTH 等于1280
MAIN_WND_HEIGHT 等于1024
BOOL CGameApp::DealFullScreen()
{
DEVMODE stDevMode = {0};
stDevMode.dmSize = sizeof(stDevMode);
stDevMode.dmPelsWidth = MAIN_WND_WIDTH; //1280
stDevMode.dmPelsHeight = MAIN_WND_HEIGHT; //1024
stDevMode.dmBitsPerPel = 32;
stDevMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
if(ChangeDisplaySettings(&stDevMode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
return FALSE;
return TRUE;
}
BOOL CGameApp::CreateGLWindow()
{
WNDCLASS wc = {0};
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.hInstance = m_hInst;
wc.lpszClassName = _T("class_name");
if(!RegisterClass(&wc))
return FALSE;
// Create The Window
g_hWnd = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_TOPMOST, _T("class_name"),
_T("title"), WS_VISIBLE | WS_POPUP,
0, 0,
MAIN_WND_WIDTH, MAIN_WND_HEIGHT,
NULL, NULL, m_hInst, NULL);
if(NULL == g_hWnd)
return FALSE;
ShowCursor(FALSE);
SetCapture(g_hWnd);
return TRUE;
}
BOOL CGameApp::InitOpengl()
{
//Get device context
m_hdcContext = ::GetDC(g_hWnd);
if(!m_hdcContext)
return FALSE;
//Set pixel format
if(!SetDCPixelFormat())
return FALSE;
//Create opengl context
m_hrcRender = wglCreateContext(m_hdcContext);
if (!m_hrcRender)
return FALSE;
if (!wglMakeCurrent(m_hdcContext, m_hrcRender))
return FALSE;
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glViewport(0, 0, MAIN_WND_WIDTH, MAIN_WND_HEIGHT);
glOrtho(0, MAIN_WND_WIDTH, 0, MAIN_WND_HEIGHT, -1, 1);
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
//m_texBack是自己封装的纹理贴图类
if(!m_texBack.InitTexture(CTexture::LINEAR, _T("..\\data\\test.bmp")))
return FALSE;
return TRUE;
}
BOOL CGameApp::SetDCPixelFormat()
{
int nPixelFormat;
PIXELFORMATDESCRIPTOR pfd = {0};
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.cColorBits = 24;
pfd.cDepthBits = 16; // Z(深度)缓冲区的深度
pfd.cStencilBits = 1; // 模板缓冲区的深度
pfd.iLayerType = PFD_MAIN_PLANE; // 忽略,新版本不需要
pfd.iPixelType = PFD_TYPE_RGBA; // 像素数据类型是RGBA,不是颜色索引
nPixelFormat = ChoosePixelFormat(m_hdcContext, &pfd);
if(!nPixelFormat)
return FALSE;
if(!SetPixelFormat(m_hdcContext, nPixelFormat, &pfd))
return FALSE;
return TRUE;
}
void CGameApp::Render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION); //透视矩阵
glPushMatrix();
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
m_texBack.Bind(); //m_texBack是自己封装的纹理贴图类
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex2f(1280.f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex2f(1280.f, 1024.f);
glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, 1024.f);
glEnd();
glDisable(GL_TEXTURE_2D);
glMatrixMode(GL_PROJECTION);
glPopMatrix();
SwapBuffers(m_hdcContext);
}
图像本身是1280 * 1024的,窗口也是按1280 * 1024的尺寸创建的全屏窗口,但是显示的时候图片能完整显示出来,只是不能占满整个窗口,麻烦大家帮我看一下问题出在什么地方。