zoukankan      html  css  js  c++  java
  • 本机Win32 API OpenGL教程-第1部分

    介绍 代码项目论坛上,用户发布的一些问题使我意识到互联网最有OpenGL的教程是可悲的是过时了。许多引用老NeHe教程后没有更新杰夫Molofee GameDev移交维护他的网站。 发布了Visual Studio 2013和2015年此后,Windows 7, 8和10。所以似乎是时候至少试着创建一些基本教程的变化。 背景 我们的目标将是简单——生产标准立方体旋转位图在一个OpenGL窗口。 以来所有的Windows版本Windows 98携带OpenGL本身没有什么您需要添加或做。Windows 7, 8和10所有运行OpenGL版本3.3.0开箱即用的但一些显卡制造商作为驱动程序安装的一部分可能促进高达4.5版本。你可以假设OpenGL 3.3版本的当前任何Windows机器上最低。 第一个问题遇到的人们试图使用NeHe教程是GLAUX库已被废弃,不再存在在Visual Studio或者作为Windows DLL。功能的理由很容易取代了使用标准的Win32 API调用和在本系列文章中,我们将使用这一过程。我看到评论所有的时间去和下载的头文件和编译DLL GLAUX但我们会避免这种没有前途。 我将尝试使用保持简单愚蠢(吻)方法和部分方法的编程代码没有对象或框架。不是因为我不相信这样的事情有优点但它是尽量保持代码尽可能简单和最广泛的观众。 代码使用标准& lt; TChar.h>接口,所以编译在Ansi, Unicode和宽字符模式。我讨论关于不做它符合KISS原则但不觉得这样做会限制编译模式和选项尤其对于非英语国家。因为涉及到所有的“字符”类型的交换“TCHAR”和一些_T语句文本字符串我觉得有损了解很少。 使用的代码 首先让我们来看看我们的OpenGL窗口系统的伪代码,我们将使用,像这样: 隐藏,复制Code

    1.) Initialize OpenGL (Called Once)
    2.) Scale the OpenGL viewPort (Initial Call)
    repeat
    3.) Draw the scene
    4.) Transfer the scene to screen
    until window closes
    
    ** Note Item 2) the scale process also gets called if the window changes size 

    这种方法的原因是,因为它将使OpenGL部分灵活包括迁移到像MFC框架,WPF等等。 我用另一个概念是把所有的OpenGL数据到一个简单的结构附加属性窗口本身。在这第一个教程,人们可能想知道为什么要这样做,因为它很容易用正常的全局变量。2课的原因将成为明显的,当我们有多个OpenGL窗口,然后在与更高级的课程后多个视窗。 这是我们的第一课OpenGLData。渲染上下文总是会在未来的教训,但所有其他数据将取决于所需要的。在我们的第一课中,我们将会加载一个位图作为一个纹理(struct gltexture),我们将把纹理的一个多维数据集和旋转(xrot, yrot被用于旋转)。 隐藏,复制Code

    typedef struct OpenGLData {
        HGLRC Rc;                                   // Our render context ** Always Needed
        GLuint glTexture;                           // Our texture to draw
        GLfloat    xrot;                            // X Rotation
        GLfloat    yrot;                            // Y Rotation
    } GLDATABASE;code blocks look like this

    基本数据结构是通过静态定义标签附加到一个窗口处理字符串使用记者API调用和检索时需要使用GetProp电话。 我们本教程中使用的标签属性: 隐藏,复制Code

    static const TCHAR* DATABASE_PROPERTY = _T("OurDataStructure");

    这是创建和附加的代码窗口句柄我们使用的数据结构: 隐藏,复制Code

    GLDATABASE* db = (GLDATABASE*) malloc(sizeof(GLDATABASE)); // Allocate structure
    db->Rc = InitGL(Wnd);                                      // Initialize OpenGL hold render context
    db->glTexture = 0;                                         // Zero the texture
    db->xrot = 0.0f;                                           // Zero x rotation
    db->yrot = 0.0f;                                           // Zero y rotation
    SetProp(Wnd, DATABASE_PROPERTY, (HANDLE) db);              // Data structure to window property

    随时,我们希望我们对数据的访问这样一个简单的检索调用: 隐藏,复制Code

    GLDATABASE* db = (GLDATABASE*) GetProp(Wnd, DATABASE_PROPERTY); // Fetch the data structure

    都说,我们在这节课然后标准窗口应用程序骨架。创建应用程序窗口,WM_CREATE将用于初始化OpenGL系统。返回的渲染上下文将在我们的数据结构。ReSizeGLScene叫做直接设置的初始大小OpenGL后系统创建的窗口大小。 与正常窗口运行,只是让我们处理WM_PAINT消息的窗口,这样的代码: 隐藏,复制Code

    case WM_PAINT: {                                                   // WM_PAINT MESSAGE
       PAINTSTRUCT Ps;
       GLDATABASE* db = (GLDATABASE*) GetProp(Wnd, DATABASE_PROPERTY); // Fetch the data base
       BeginPaint(Wnd, &Ps);                                           // Begin paint
       DrawGLScene(db, Ps.hdc);                                        // Draw the OpenGL scene
       SwapBuffers(Ps.hdc);                                            // Swap buffers
       EndPaint(Wnd, &Ps);                                             // End paint
       return 0;
    }

    它开始正常BeginPaint叫但然后调用OpenGL画场景到渲染上下文。返回,我们交换渲染上下文到PaintStructure设备上下文OpenGL场景吸引到我们的窗口。然后,我们清理并退出。 诀窍是渲染过程不断地运行它不仅仅发生在WM_PAINT消息如果你希望提供动画,您需要提供WM_PAINT消息后的变化。当我们启动计时器,它改变了旋转然后无效的窗口,创建一个WM_PAINT消息窗口重绘。 这个过程是gr在构建3D对象编辑器之类的东西上很有用,但在快速移动的游戏中并不适用,因为我们需要对场景进行快速连续的渲染处理。在后面的课程中,我们将处理这个进程并使用线程。 现在,运行程序,使用文件菜单,选择加载位图,这样做,你会看到如下: 现在开始计时,你的立方体应该开始旋转,这就是这一课的内容。我们的第一个OpenGL教程完成了OpenGL在标准应用程序窗口中运行。 在下一课中,我们将进一步使用MDI应用程序。 历史 版本1.0:第一次发布代码 本文转载于:http://www.diyabc.com/frontweb/news7294.html

  • 相关阅读:
    vimrc 配置 史上最牛
    nmap 黑客 端口扫描(转)
    linux export 命令(转)
    【引用】linux下编译静态库ranlib有什么用
    vim map nmap(转)
    vim 自定义命令 自定义快捷键(转)
    vimrc初学 vim 快捷键 map(转)
    vim 取消 查找 高亮
    Java内存模型(JMM)学习总结
    Struts2和Spring整合
  • 原文地址:https://www.cnblogs.com/Dincat/p/13467485.html
Copyright © 2011-2022 走看看