为什么我用OpenGL画的图形显示不出来?

sujinzhao407 2004-05-02 10:17:32
我在MFC下用OpenGL画了一条直线,但是不知道为什么显示不出来?请教高手!其中,View.cpp里的代码如下:
void CLineView::OnDraw(CDC* pDC)
{
CLineDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here

RenderScene();
}

// CLineView message handlers
BOOL CLineView::InitializeOpenGL(CDC* pDC)
{
m_pDC = pDC;
SetupPixelFormat();
//生成绘制描述表
m_hRC = ::wglCreateContext(m_pDC->GetSafeHdc());
//置当前绘制描述表
::wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);

return TRUE;
}

BOOL CLineView::RenderScene()
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
glBegin(GL_LINES);
glColor3f (1.0, 0.0, 0.0);
glVertex2i(10,20);
glVertex2i(100,200);
glEnd();
glFlush();

::SwapBuffers(m_pDC->GetSafeHdc()); //交互缓冲区
return TRUE;
}

//////////////////////////////////////////////////////////////////////
// 设置逻辑调色板
//////////////////////////////////////////////////////////////////////
void CLineView::SetLogicalPalette(void)
{
struct
{
WORD Version;
WORD NumberOfEntries;
PALETTEENTRY aEntries[256];
} logicalPalette = { 0x300, 256 };

BYTE reds[] = {0, 36, 72, 109, 145, 182, 218, 255};
BYTE greens[] = {0, 36, 72, 109, 145, 182, 218, 255};
BYTE blues[] = {0, 85, 170, 255};

for (int colorNum=0; colorNum<256; ++colorNum)
{
logicalPalette.aEntries[colorNum].peRed =
reds[colorNum & 0x07];
logicalPalette.aEntries[colorNum].peGreen =
greens[(colorNum >> 0x03) & 0x07];
logicalPalette.aEntries[colorNum].peBlue =
blues[(colorNum >> 0x06) & 0x03];
logicalPalette.aEntries[colorNum].peFlags = 0;
}

m_hPalette = CreatePalette ((LOGPALETTE*)&logicalPalette);
}

//////////////////////////////////////////////////////////
// 设置像素格式
//////////////////////////////////////////////////////////
BOOL CLineView::SetupPixelFormat()
{
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // pfd结构的大小
1, // 版本号
PFD_DRAW_TO_WINDOW | // 支持在窗口中绘图
PFD_SUPPORT_OPENGL | // 支持 OpenGL
PFD_DOUBLEBUFFER, // 双缓存模式
PFD_TYPE_RGBA, // RGBA 颜色模式
24, // 24 位颜色深度
0, 0, 0, 0, 0, 0, // 忽略颜色位
0, // 没有非透明度缓存
0, // 忽略移位位
0, // 无累加缓存
0, 0, 0, 0, // 忽略累加位
32, // 32 位深度缓存
0, // 无模板缓存
0, // 无辅助缓存
PFD_MAIN_PLANE, // 主层
0, // 保留
0, 0, 0 // 忽略层,可见性和损毁掩模
};
int pixelformat;
pixelformat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);//选择像素格式
::SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd); //设置像素格式
if(pfd.dwFlags & PFD_NEED_PALETTE)
SetLogicalPalette(); //设置逻辑调色板
return TRUE;
}

int CLineView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
//初始化OpenGL
m_pDC = new CClientDC(this);
InitializeOpenGL(m_pDC);

return 0;
}

void CLineView::OnDestroy()
{
CView::OnDestroy();

// TODO: Add your message handler code here
//删除调色板和渲染上下文、定时器
::wglMakeCurrent(NULL,NULL);
::wglDeleteContext( m_hRC);
if (m_hPalette)
DeleteObject(m_hPalette);
if ( m_pDC )
{
delete m_pDC;
}

}
...全文
1085 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
fyjin99 2004-05-03
  • 打赏
  • 举报
回复
是呀,如果楼主给的代码是全的,那么就是范围的问题,
在程序里添加glOrtho(0, 200, 0, 200, -1, 1);
放在InitializeOpenGL()里面就行,不过如果你有 reshape()函数的话,放在reshape()里面是最好不过了。
hmsxg4160 2004-05-03
  • 打赏
  • 举报
回复

glColor3f (1.0, 0.0, 0.0);
glVertex2i(10,20);
glVertex2i(100,200);


范围在-1到1,你的线条画了,但在屏幕外面
sujinzhao407 2004-05-03
  • 打赏
  • 举报
回复
谢谢老狼和老板两位大哥,现在我已经画出来了,谢谢!
OpenGL编3D游戏(含全部源程序)讲述3D游戏的编写方法。 《学OpenGL编3D游戏》重在游戏的实现方案。全书以一个完整(基本)的3D游戏为主线,采用循序渐进的方法,从建立OpenGL图形环境入手,讲解3D基本图形、构图原理;从引入摄像机,建立天空、山地、树木,到3D模型使用和3D动模型的显示。用鱼骨方式讲解相关知识技术,完整地展示了3D游戏的编写过程。● 特点 重在游戏的基本实现方法 搭建一个基本功能的游戏环境 最新的外部功能模块的使用● 提供《学OpenGL编3D游戏》的教学演示课件 《学OpenGL编3D游戏》的教学课件。用多媒体的表现手法将学习过程完全显示在你面前,使用者可以随时查看所选章节的知识要点提示,可以观看程序的制作过程和效果,也可以马上进入到VC编辑器对范例程序修修改改,在实践中加深对知识的理解;还可以进入到网上论坛和朋友们讨论学习心得。● 内容提要第1 章 OpenGL的程序框架__Windows、OpenGL程序框架的建立。第2 章 OpenGL的基本图形__在OpenGL图形界面上作一些简单的图形。第3 章 OpenGL的组合图形__用简单图形来构成两个复杂一点的3D模型。第4 章 摄像漫游__________有了摄像机你就可以在OpenGL场景中自由地漫游了。第5 章 开天辟地__________在OpenGL场景中有了天空、大地、景物。第6 章 OpenGL显示文字__介绍了OpenGL中文字的几种显示方式。第7 章 特殊的平面_树_____栽些树种些草,让这个OpenGL世界充满生机。第8 章 显示3D模型________在OpenGL场景中显示3DS格式的模型。第9 章 使用MD2动模型___OpenGL场景中出现了活生生的人(3D动模型)。第10 章 使用MDL动模型__介绍一种更先进的动模型—3D骨骼动。第11章 射击、爆炸________逼真的爆炸效果,是用程序仿真爆炸的物理过程。第12章 碰撞检测__________加入碰撞检测后,游戏才有真实的感觉。第13章 游戏进度保存______场景(或进度)保存和调入是游戏必不可少的。

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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