【求助】MFC对话框模式下,opengl显示位图

狐狸小十 2016-04-03 02:41:58
不太懂论坛怎么用,可能是我等级太低了,最多只能给100分。
手里还有1000多分,如果有追分或转账功能,愿倾囊报答...也不知道是多是少,一点心意吧,不够我再去充。
困扰好几天了,求高人降临!
这是VS2015的工程源码

我想用MFC对话框模式使用opengl,现在能够绘图了,但是位图显示不出来,找了好多种方法了都不行
不知道是参数错了,还是绑定纹理错了,或者是对话框模式不太一样
刚接触opengl不久,不太懂,最好能帮我写一下位图从加载到绑定、再到显示的过程

这是我在MainDlg类里加的成员
protected:
HGLRC hRC;
HDC hDC;
GLuint texture;
unsigned int m_nFPS=60;
public:
BOOL InitPixelFormat();//绑定DC
void ChangeDrawWinSize();
void DrawScene();

在InitPixelFormat()中绑定DC,DrawScene绘图,然后用Ontimer反复调用DrawScene

BOOL CMainDlg::InitPixelFormat()
{
PIXELFORMATDESCRIPTOR pixelDesc;
pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pixelDesc.nVersion = 1;
pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_TYPE_RGBA;
pixelDesc.iPixelType = PFD_TYPE_RGBA;
pixelDesc.cColorBits = 24;
pixelDesc.cRedBits = 0;
pixelDesc.cRedShift = 0;
pixelDesc.cGreenBits = 0;
pixelDesc.cGreenShift = 0;
pixelDesc.cBlueBits = 0;
pixelDesc.cBlueShift = 0;
pixelDesc.cAlphaBits = 0;
pixelDesc.cAlphaShift = 0;
pixelDesc.cAccumBits = 0;
pixelDesc.cAccumRedBits = 0;
pixelDesc.cAccumGreenBits = 0;
pixelDesc.cAccumBlueBits = 0;
pixelDesc.cAccumAlphaBits = 0;
pixelDesc.cDepthBits = 0;
pixelDesc.cStencilBits = 1;
pixelDesc.cAuxBuffers = 0;
pixelDesc.iLayerType = PFD_MAIN_PLANE;
pixelDesc.bReserved = 0;
pixelDesc.dwLayerMask = 0;
pixelDesc.dwVisibleMask = 0;
pixelDesc.dwDamageMask = 0;
int pixelformat;
hDC = ::GetDC(this->GetSafeHwnd());
if (!(pixelformat = ChoosePixelFormat(hDC, &pixelDesc)))
{
MessageBox(_T("ChoosePixelFormat failed!"));
return FALSE;
}
if (!SetPixelFormat(hDC, pixelformat, &pixelDesc))
{
MessageBox(_T("SetPixelFormat failed!"));
return FALSE;
}
if (!(hRC = wglCreateContext(hDC)))
{
MessageBox(_T("CreateContext failed!"));
return FALSE;
}
if (!wglMakeCurrent(hDC, hRC))
{
MessageBox(_T("MakeCurrent failed!"));
return FALSE;
}
return TRUE;
}


void CMainDlg::ChangeDrawWinSize()
{
CRect rect;
GetClientRect(rect);

glViewport(0, 0, rect.Width(), rect.Height());
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, rect.Width() / rect.Height(), 0.1f, 100.0f);// 计算窗口的外观比例
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // 黑色背景
glClearDepth(1.0f); // 设置深度缓存
glEnable(GL_DEPTH_TEST); // 启用深度测试
glDepthFunc(GL_LEQUAL); // 所作深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 真正精细的透视修正
}


void CMainDlg::DrawScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(-1.0f, 0.0f, -3.0f);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);//没有纹理.....不会!!!
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(0, 0, 0);
glTexCoord2f(1, 0); glVertex3f(1, 0, 0);
glTexCoord2f(1, 1); glVertex3f(1, 1, 0);
glTexCoord2f(0, 1); glVertex3f(0, 1, 0);
glEnd();
SwapBuffers(hDC);
}
...全文
193 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2016-04-07
  • 打赏
  • 举报
回复
"2个OpenGL对象" http://download.csdn.net/detail/schlafenhamster/8081047 "2个OpenGL对象, 一个使用对话框,一个使用 静态控件."
Yofoo 2016-04-04
  • 打赏
  • 举报
回复
可以用 glTexImage2D 创建 Texture, 我试了下是可以的 在InitPixelFormat 后面添加一下代码(用了gdi+, 相关的加入进去)

	WCHAR	*pFilePath = L"v:\\1.png";
	BYTE	*pDat = GetFileData(pFilePath);
	Bitmap	*pImage;
	Gdiplus::Rect			RctLock;
	Gdiplus::BitmapData		BitmapDat;
	GdiplusStartupInput		StartupIn;
	ULONG_PTR s_uGdiplusToken;
	BYTE			*pFullDat;

	GdiplusStartup(&s_uGdiplusToken, &StartupIn, NULL);
	pImage = pImage->FromFile(pFilePath);
	RctLock.X		= 0;
	RctLock.Y		= 0;
	RctLock.Width	= pImage->GetWidth();
	RctLock.Height	= pImage->GetHeight();
	pImage->LockBits(&RctLock, Gdiplus::ImageLockModeRead, PixelFormat24bppRGB, &BitmapDat);
	pFullDat = (BYTE *)BitmapDat.Scan0;

	glEnable(GL_TEXTURE_2D);
	glGenTextures(1, &texture);
	glBindTexture(GL_TEXTURE_2D, texture);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, pImage->GetWidth() ,pImage->GetHeight(), 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, pFullDat);
	delete pImage;
狐狸小十 2016-04-03
  • 打赏
  • 举报
回复
引用 2 楼 yuelengdihai 的回复:
#include "glos.h"
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h> 
void myinit(void);
void CALLBACK myReshape(GLsizei w, GLsizei h);
void CALLBACK display(void); 
GLubyte rasters[12] = {  0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc,    0xfc, 0xc0, 0xc0, 0xc0, 0xff, 0xff};   
void myinit(void)  
{    
  glPixelStorei (GL_UNPACK_ALIGNMENT, 1);    
  glClearColor (0.0, 0.0, 0.0, 0.0);    
  glClear(GL_COLOR_BUFFER_BIT);  
}   
void CALLBACK display(void)  
{    
  glColor3f (1.0, 0.0, 1.0);    
  glRasterPos2i (100, 200);    
  glBitmap (8, 12, 0.0, 0.0, 20.0, 20.0, rasters);   
  lBitmap (8, 12, 0.0, 0.0, 0.0, 0.0, rasters);     
  glColor3f (1.0, 1.0, 0.0);    glRasterPos2i (150, 200);    
  glBitmap (8, 12, 0.0, 0.0, 0.0, 0.0, rasters);     
  glFlush();  
}   
void CALLBACK myReshape(GLsizei w, GLsizei h)  
{    
  glViewport(0, 0, w, h);    
  glMatrixMode(GL_PROJECTION);    
  glLoadIdentity();    
  glOrtho (0, w, 0, h, -1.0, 1.0);    
  glMatrixMode(GL_MODELVIEW);  
}   
void main(void)  
{    
  auxInitDisplayMode (AUX_SINGLE | AUX_RGBA);    
  auxInitPosition (0, 0, 500, 500);    
  auxInitWindow ("Bitmap");    
  myinit();    
  auxReshapeFunc (myReshape);    
  auxMainLoop(display);  
} 
参考下
glaux当然没问题,但是我想用MFC对话框模式,用习惯了
cocoabird 2016-04-03
  • 打赏
  • 举报
回复
#include "glos.h"
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h> 
void myinit(void);
void CALLBACK myReshape(GLsizei w, GLsizei h);
void CALLBACK display(void); 
GLubyte rasters[12] = {  0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc,    0xfc, 0xc0, 0xc0, 0xc0, 0xff, 0xff};   
void myinit(void)  
{    
  glPixelStorei (GL_UNPACK_ALIGNMENT, 1);    
  glClearColor (0.0, 0.0, 0.0, 0.0);    
  glClear(GL_COLOR_BUFFER_BIT);  
}   
void CALLBACK display(void)  
{    
  glColor3f (1.0, 0.0, 1.0);    
  glRasterPos2i (100, 200);    
  glBitmap (8, 12, 0.0, 0.0, 20.0, 20.0, rasters);   
  lBitmap (8, 12, 0.0, 0.0, 0.0, 0.0, rasters);     
  glColor3f (1.0, 1.0, 0.0);    glRasterPos2i (150, 200);    
  glBitmap (8, 12, 0.0, 0.0, 0.0, 0.0, rasters);     
  glFlush();  
}   
void CALLBACK myReshape(GLsizei w, GLsizei h)  
{    
  glViewport(0, 0, w, h);    
  glMatrixMode(GL_PROJECTION);    
  glLoadIdentity();    
  glOrtho (0, w, 0, h, -1.0, 1.0);    
  glMatrixMode(GL_MODELVIEW);  
}   
void main(void)  
{    
  auxInitDisplayMode (AUX_SINGLE | AUX_RGBA);    
  auxInitPosition (0, 0, 500, 500);    
  auxInitWindow ("Bitmap");    
  myinit();    
  auxReshapeFunc (myReshape);    
  auxMainLoop(display);  
} 
参考下
ynsenyu 2016-04-03
  • 打赏
  • 举报
回复
 gluPerspective(45.0f, rect.Width() / rect.Height(), 0.1f, 100.0f);// 计算窗口的外观比例   
rect.Width()*1.0f / rect.Height()

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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