OpenGL全屏显示2D图片的问题

kimochi 2010-10-08 09:17:42
做了一个简单的程序,只是用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的尺寸创建的全屏窗口,但是显示的时候图片能完整显示出来,只是不能占满整个窗口,麻烦大家帮我看一下问题出在什么地方。
...全文
400 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
kimochi 2010-10-12
  • 打赏
  • 举报
回复
谢谢大家,问题解决了
kimochi 2010-10-09
  • 打赏
  • 举报
回复
谢谢,不过边框的尺寸怎么加啊。
huazai434 2010-10-09
  • 打赏
  • 举报
回复
你设置的点的坐标的一个单位一定对应屏幕的一个像素吗?
gamemagic 2010-10-09
  • 打赏
  • 举报
回复
adjust window rect,好像是这个,你谷歌下
gamemagic 2010-10-08
  • 打赏
  • 举报
回复
你的窗口外边框是1280*1024,但是内边框却不是。
CreateWindow指定的只是外边框尺寸,所以要加上边框的尺寸

8,325

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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