VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1149|回复: 7

VC++和OPENGL开发1

[复制链接]

3

主题

7

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-2-16 12:30:01 | 显示全部楼层 |阅读模式
OpenGL应用程序框架的建立
#include <gl\gl.h> // OpenGL32库的头文件
#include <gl\glu.h> // GLu32库的头文件
#include <gl\glaux.h> // GLaux库的头文件

初始化OpenGL
SetOpenGLInterface()
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, // 无alpha缓存
 0, // 忽略转换位
 0, // 无累计位
 0, 0, 0, 0,
 32, // 32位深度缓存
 0, // 无模版缓存
 0, // 无辅助缓存
 PFD_MAIN_PLANE, // 主绘制层
 0, // 保留
 0, 0, 0 // 忽略的层掩模
};
m_pDC = GetDC(); // 得到设备环境句柄
int iFormat = ChoosePixelFormat(m_pDC->m_hDC, &pfd); // 设置象素格式
SetPixelFormat(m_pDC->m_hDC, iFormat, &pfd);
m_hGlrc = wglCreateContext(m_pDC->m_hDC); // 创建渲染上下文
wglMakeCurrent(m_pDC->m_hDC, m_hGlrc); // 设置一个线程的当前绘图描述表
DEM数据结构的定义

ReleaseDC(m_pDC); // 释放DC
if (m_hGlrc != NULL) // 释放RC
wglDeleteContext(m_hGlrc);

设置一下场景
InitOpenGL()
GLfloat light_position[] = {0.0, 0.0, 1.0, 0.0}; // 定义光源的位置坐标
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
GLfloat light_ambient[] = {0.0, 0.0, 0.0, 1.0}; // 定义环境反射光
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0}; // 定义漫反射光
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0}; // 定义镜面反射光
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
GLfloat light_model_ambient[] = {0.4f, 0.4f, 0.4f, 1.0f}; // 定义光模型参数
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, light_model_ambient);
GLfloat local_view[] = {0.0};
glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);


glEnable(GL_LIGHTING); // GL_LIGHTING有效
glEnable(GL_LIGHT0); // GL_LIGHT0有效
glEnable(GL_DEPTH_TEST); // 允许深度比较
glDepthFunc(GL_LESS); // 激活深度比较
glClearColor(0.1f, 0.1f, 0.5f, 0.0f); // 设置蓝色背景
glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE); // 权衡图像质量与绘制速度

进行视口的定义
InitViewPort()
CRect rect; // 得到绘图客户区的大小
GetClientRect(rect);
glMatrixMode(GL_PROJECTION); // 设置投影模式
glLoadIdentity(); // 装载单位矩阵
if (m_nViewMode == 0) // 建立一个透视投影矩阵
 gluPerspective(90.0, rect.Width() / rect.Height(), 1.0, 10000.0);
if (m_nViewMode == 1) // 建立一个正射投影矩阵
 glOrtho(-0.5 * 10000.0, 0.5 * 10000.0, -0.5 * 10000.0, 0.5 * 10000.0, 1.0, 10000.0); glViewport(0, 0, rect.Width(), rect.Height()); // 重定视口
 glMatrixMode(GL_MODELVIEW); // 确定当前矩阵模式
 glLoadIdentity(); // 装载单位矩阵

这是再网上找的代码,我不太懂,希望懂得大侠帮忙调试一下。
回复

使用道具 举报

0

主题

55

帖子

32.00

积分

新手上路

Rank: 1

积分
32.00
发表于 2020-4-28 08:45:01 | 显示全部楼层
先编译和连接看看,有什么问题没有。
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-7-12 15:00:01 | 显示全部楼层
先要把连接弄清楚,设置里面要弄好,呵呵
回复

使用道具 举报

3

主题

7

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-7-12 21:15:01 | 显示全部楼层
里面的连接都弄好了就是还是又很多错误,我想关键是我对VC++的运行模式不熟,可能代码的位置没有放好,所以希望看过类似东西的朋友指点一下。
谢谢了
回复

使用道具 举报

0

主题

14

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
发表于 2020-7-13 17:30:01 | 显示全部楼层
参考一下
BOOL CSingleView::PreCreateWindow(CREATESTRUCT& cs)
{
        // TODO: Modify the Window class or styles here by modifying
        //  the CREATESTRUCT cs
////////////////////////////////////////////////////////////////
//设置窗口类型
        cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
////////////////////////////////////////////////////////////////
        return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CSingleView drawing
void CSingleView::OnDraw(CDC* pDC)
{
        CSingleDoc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        // TODO: add draw code for native data here
//////////////////////////////////////////////////////////////////
        RenderScene();        //渲染场景
//////////////////////////////////////////////////////////////////

}
int CSingleView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
        if (CView::OnCreate(lpCreateStruct) == -1)
                return -1;
       
        // TODO: Add your specialized creation code here
//////////////////////////////////////////////////////////////////
//初始化OpenGL和设置定时器
        m_pDC = new CClientDC(this);
        SetTimer(1, 20, NULL);
        InitializeOpenGL(m_pDC);
//////////////////////////////////////////////////////////////////
        Init();               
        return 0;
}
void CSingleView::OnDestroy()
{
        CView::OnDestroy();
       
        // TODO: Add your message handler code here
/////////////////////////////////////////////////////////////////
//删除调色板和渲染上下文、定时器
        ::wglMakeCurrent(0,0);
        ::wglDeleteContext( m_hRC);
        if (m_hPalette)
            DeleteObject(m_hPalette);
        if ( m_pDC )
        {
                delete m_pDC;
        }
        KillTimer(1);               
/////////////////////////////////////////////////////////////////
       
}

void CSingleView::OnSize(UINT nType, int cx, int cy)
{
        CView::OnSize(nType, cx, cy);
       
        // TODO: Add your message handler code here
/////////////////////////////////////////////////////////////////
//添加窗口缩放时的图形变换函数
        glViewport(0,0,cx,cy);
/////////////////////////////////////////////////////////////////
        GLdouble aspect_ratio;
        aspect_ratio = (GLdouble)cx/(GLdouble)cy;
        ::glMatrixMode(GL_PROJECTION);
        ::glLoadIdentity();
        gluPerspective(40.0F, aspect_ratio, 1.0F, 10000.0F);
        ::glMatrixMode(GL_MODELVIEW);
        ::glLoadIdentity();
       
}
void CSingleView::OnTimer(UINT nIDEvent)
{
        // TODO: Add your message handler code here and/or call default
/////////////////////////////////////////////////////////////////
//添加定时器响应函数和场景更新函数
        Invalidate(FALSE);       
/////////////////////////////////////////////////////////////////
       
        CView::OnTimer(nIDEvent);
}

/////////////////////////////////////////////////////////////////////
//                          设置逻辑调色板
//////////////////////////////////////////////////////////////////////
void CSingleView::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);
}


//////////////////////////////////////////////////////////
//                                                初始化openGL场景
//////////////////////////////////////////////////////////
BOOL CSingleView::InitializeOpenGL(CDC* pDC)
{
        m_pDC = pDC;
        SetupPixelFormat();
        //生成绘制描述表
        m_hRC = ::wglCreateContext(m_pDC->GetSafeHdc());
        //置当前绘制描述表
        ::wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);

        return TRUE;
}

//////////////////////////////////////////////////////////
//                                                设置像素格式
//////////////////////////////////////////////////////////
BOOL CSingleView::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;
}


//////////////////////////////////////////////////////////
//                                                场景绘制与渲染
//////////////////////////////////////////////////////////
BOOL CSingleView::RenderScene()
{
...............
...............
}
void CSingleView::Init(GLvoid)
{
.............
.............
}
回复

使用道具 举报

3

主题

7

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-7-21 11:00:01 | 显示全部楼层
非常感谢“addforever”同志的指点。
希望能讲一下程序绘制opengl的图像时,所经历的过程。本人比较笨,只有这样,才能明白到底opengl绘制函数应该放在那里。
希望能附一小段实例代码。
功能是
有定义的几个空间点(7,8个就可以了)(X,Y,Height)绘制一个面的过程。不知可否?
关注中
回复

使用道具 举报

0

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-7-29 18:30:01 | 显示全部楼层
学习OPENGL可以看NEHE的教程,我自己对OPENGL封装了一个OCX控件,可以方便的使用到对话框以及其它程序中,蛮方便的,可以发给你
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-29 20:15:01 | 显示全部楼层
有人给你指点真好,我都是自己搞明白的,现在感觉就一个字:简单。
在MFC下,无非就是设置象素格式,测试象素格式,DC RC想连,这是程序的初始化。还有场景的初始化看看相机模型就明白了(这里面包括很多东西,其实也很简单),其他的设置像消隐反走样光照材质贴图也都不难。我自己感觉最难的是建模部分,到最好编程问题变成了一个与自己专业相关的数学问题。


最后别忘了释放内存哦~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

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