游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2165|回复: 1

建立一个OGL 编程框架

[复制链接]

1

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2005-8-22 20:13:00 | 显示全部楼层 |阅读模式
一,建立库模块GameLib :
    1, 建立图形封装类 CGraph
    2, 定义类的对外接口
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//初始化GRAPH
bool CGraph::Init(HDC hDC)
{
        if(!hDC)
                return false;
        m_hDC = hDC;
        PIXELFORMATDESCRIPTOR pfd = {
                sizeof(PIXELFORMATDESCRIPTOR),    // pfd结构的大小
                        1,                                // 版本号
                        PFD_DRAW_TO_WINDOW |              // 支持在窗口中绘图
                        PFD_SUPPORT_OPENGL |              // 支持 OpenGL
                        PFD_DOUBLEBUFFER,                 // 双缓存模式
                        PFD_TYPE_RGBA,                    // RGBA 颜色模式
                        24,                       // 颜色深度
                        0, 0, 0, 0, 0, 0,                 // 忽略颜色位
                        0,                                // 没有非透明度缓存
                        0,                                // 忽略移位位
                        0,                                // 无累加缓存
                        0, 0, 0, 0,                       // 忽略累加位
                        32,                       // 深度缓存     
                        0,                                // 无模板缓存
                        0,                                // 无辅助缓存
                        PFD_MAIN_PLANE,                   // 主层
                        0,                                // 保留
                        0, 0, 0                           // 忽略层,可见性和损毁掩模
        };
       
        // 为设备描述表得到最匹配的像素格式        
        int nResult = ChoosePixelFormat(m_hDC,&pfd);
        if(nResult == 0)
                return false;       
        // 设置最匹配的像素格式为当前的像素格式
        if(!SetPixelFormat(m_hDC, nResult, &pfd))
        {
                return false;
        }

        // 创建渲染描述表
        m_hGLRC = wglCreateContext(m_hDC);
        if(m_hGLRC == NULL)
                return false;
       
        // 使绘图描述表为当前调用现程的当前绘图描述表
        if(!wglMakeCurrent(m_hDC, m_hGLRC))
                return false;               
        return true;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
设置 摄象机位置:       
void CGraph:ook()
{
        gluLookAt(0,0,-2,0,0,0,0,1,0);       
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
图形绘制开始与完成。
void CGraph::Begin()
{
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();       
}
void CGraph::End()
{
        glFlush();
        SwapBuffers(m_hDC);               
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
旋转与缩放
void CGraph::Rotatef(float fX, float fY, float fZ)
{
        glRotatef(fX,1.0,0.0,0.0);
        glRotatef(fY,0.0,1.0,0.0);
        glRotatef(fZ,0.0,0.0,1.0);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
设置视口位置
void CGraph::SetViewPort(int nWidth, int nHeight)
{
        // 设置视口变换       
        glViewport(0, 0, nWidth, nHeight);

        // 设置透视变换
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(m_fFov, (GLdouble)nWidth/(GLdouble)nHeight, m_fNear, m_fFar);                
        glMatrixMode(GL_MODELVIEW);       
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
绘制 BOX 和 坐标轴 (实现看代码)
void DrawColorBox();
void DrawAxis();
///////////////////////////////////////////////////////////////////////////////////////////////////////////
二,打建MFC框架:
1,建立单文档工程 OGLFrm:
  COGLFrmView中加:   CGraph                m_objGraph;
2,在 COGLFrmView::OnCreate 中
  初始化 GRAPH        : m_objGraph.Init(GetDC()->GetSafeHdc());
  启动OGL时钟:   SetTimer(1, 30, NULL)。
3,  COGLFrmView 中加 函数  RenderScene()。
void COGLFrmView::RenderScene()
{
        m_objGraph.Begin();

        ////////////////////////////////
        m_objGraph.Look();


        //旋转,缩放---BEGIN
        static float s_fScale=0;
        s_fScale += 0.005;       
    if(s_fScale > 1.0)
                s_fScale = 0.005;

        static float s_fRotate = 0;
        s_fRotate += 1.0;
    if (s_fRotate > 360.0)
                s_fRotate -= 360.0;
        //绘制轴
        m_objGraph.Rotatef(0, s_fRotate, 0);
        m_objGraph.DrawAxis();

        m_objGraph.Rotatef(s_fRotate,s_fRotate,s_fRotate);
        m_objGraph.Scalef(s_fScale, s_fScale, s_fScale);
        //旋转,缩放---END

        //绘制实体
        m_objGraph.DrawColorBox();

        m_objGraph.End();
}

4, OnTimer中调用RenderScene()以渲染场景。
  void COGLFrmView::OnTimer(UINT nIDEvent)
{  
          if(nIDEvent == 1) //OGL时钟
        {
                RenderScene();               
        }
       
        CView::OnTimer(nIDEvent);
}

sf_2005822201251.rar

221.18 KB, 下载次数:

18

主题

279

帖子

279

积分

中级会员

Rank: 3Rank: 3

积分
279
QQ
发表于 2005-8-23 17:50:00 | 显示全部楼层

Re: 建立一个OGL 编程框架

Exp:-1??
怎么做到的 [em24]

PS:上面贴的这个东西能说明一下目的吗?
为哪一类程序准备的,看起来似乎机简单了一点
不要 [em21]我
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-27 13:37

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表