Opengl 之 窗口初体验 ------ By YDD的铁皮锅

  大二的时候开始想着做游戏,因为学校的课程实在是无聊就想着做些有意义的事情。毕竟学了编程这一行就得做些实事,于是就在网上搜了一下图形编程,偶然的了解到了Opengl (同时还有Windows上的Direct3D 但由于Opengl的跨平台等原因入了坑)。虽然到现在也没写出什么小游戏出来,毕竟一个用一个那么底层的图像接口做一个有玩法有乐趣的游戏工作量还是很大的。然后因为最近刚开了博客想起这段学习经历,于是这几天就再看了一下我之前写过的代码,把我的理解写下来希望对别人有帮助同时也写给未来的自己。

  首先我是在Windows上编写OpenGL的,但网上大多数都叫你去下一个glut库来创建Windows窗口,因为这样简单方便不用再去学Windows的API。这些教程也就不需要再给你介绍这些东西,但我个人觉得应该用Windows的API来创建窗口;这因为Windows提供很多API,通过这些API我们可以实现很多功能,而创建窗口的这些API是很基础的;学习这些API你可以更好的了解Windows,而且使用API可以更加灵活的定制你自己想要的窗口和实现甘glut库没有提供的功能。对于Linux由于我学识有限还不知道怎么使用Opengl大家可以自行百度一下。

// Win32Project.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"

//Windows消息循环 处理各种信息
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
    WPARAM wParam, LPARAM lParam)
{

    switch (message)
    {
    case WM_CREATE:
        return 0;
    case WM_CLOSE:
        PostQuitMessage(0);
        return 0;

    case WM_DESTROY:
        return 0;

    case WM_KEYDOWN: //键盘按下消息
        return 0;

    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
}

//Windows程序入口函数
int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int iCmdShow)
{

    HDC hDC;
    HGLRC hRC;
    MSG msg;
    BOOL bQuit = FALSE;

    WNDCLASS wc;

    wc.style = CS_OWNDC;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = TEXT("GLSample");
    RegisterClass(&wc);

    //下面这个函数中间的4个数字前两个是屏幕的x,y后面是高宽
    HWND hWnd = CreateWindowA("GLSample", "OpenGL Sample", WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE, 0, 0, 400, 600, NULL, NULL, hInstance, NULL);
    if (hWnd == NULL) return -1;

    hDC = GetDC(hWnd);

    PIXELFORMATDESCRIPTOR pfd;

    ZeroMemory(&pfd, sizeof(pfd));
    pfd.nSize = sizeof(pfd);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 24;
    pfd.cDepthBits = 16;
    pfd.iLayerType = PFD_MAIN_PLANE;

    int iFormat = ChoosePixelFormat(hDC, &pfd);
    SetPixelFormat(hDC, iFormat, &pfd);

    hRC = wglCreateContext(hDC);
    wglMakeCurrent(hDC, hRC);

    while (!bQuit)
    {

        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {

            if (msg.message == WM_QUIT)
            {
                bQuit = TRUE;
            }
            else
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
        else
        {

            glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/*
               在这里添加Opengl代码
*/
            SwapBuffers(hDC);

            Sleep(10);
        }
    }

    wglMakeCurrent(NULL, NULL);
    wglDeleteContext(hRC);
    ReleaseDC(hWnd, hDC);
    DestroyWindow(hWnd);

    return msg.wParam;
}

  上面这个代码你要用Visual Studio或Visual C++创建一个Win32工程来使用,因为博主我用的是Visual Studio 2015所以以下的图片都是在VS2015截的,VS和VC的向导界面是不同的,但大概意思的选项还是能找到的,因为博主比较懒所以就只在关键步骤发图了。

  打开VS或VC → 新建 → 项目

  弹出创建向导,找到Visual C++下的Win32,里面有个Win32控制台和Win32项目,选择Win32项目写一个喜欢的项目名字点确定。

  之后会再弹出一个向导,直接点下一步确定不,过要注意以下选项。

  如果你是初学者,你应该在创建向导界面不要勾选空项目这个选项,他自己生成的代码可以帮助你更好的分析和入门

接下来VS会帮你创建好很多文件,这些文件你可能不知道有什么作用。

如下图:

但关键的文件就4个stdafx.h , stdafx.cpp ,你取的工程名加.h 和工程名.cpp(PS:这里我取得名字为Win32Project3)。

然后再简单讲解一下4个文件的作用

stdafx.h:你把VS自带的头文件例如<iostream>、<Windows.h>都包含在这个文件中。在你第一次编译时生成一个.pch文件之后编译编译器会利用这个文件加快你的编译速度

stdafx.cpp:包含stdafx.h头文件具体为什么要有这个文件我就不太清楚了知道的大佬可以留言给我

Win32Project.h:头文件可以写你自己定义的结构体、类和变量

Win32Project.cpp:这次我们的代码就写在这里WinMain主要的文件

现在创建好了一个工程你点调试→开始调试运行就能弹出一个Windows窗口

接下来双击打开Win32Project.cpp删除原来的代码把文章开头的代码粘贴过来

开始调试发现报错因为没有引入头文件

在stdafx.h文件中加入 #include <gl/GL.h>当然你也可以直接加在Win32Project.cpp文件里

再次调试运行 一般情况下都会出现如下结果

这是因为没有引入OpenGL的Lib库文件可以在stdafx.h 或 Win32Project.cpp加入#pragma comment(lib, "opengl32.lib")来引用OpenGL库文件

最后调试运行

如果你的窗口变黄了就代表你成功了

下篇Blog我打算写OpenGL的glew库的使用,个人觉得glew对OpenGL来说是十分重要的

最后就是博主是第一次写博文,写的不好多多包涵,有任何问题可以给我留言。

原文地址:https://www.cnblogs.com/yddsblog/p/11084835.html

时间: 2024-10-21 14:44:56

Opengl 之 窗口初体验 ------ By YDD的铁皮锅的相关文章

Opengl ES Glew库 ----- By YDD的铁皮锅

前一篇随笔我写了Opengl的窗口创建,这一篇随笔我要写OpenGL glew库的使用.首先需要引入头文件h,库文件Lib和动态链接库DLL,百度搜索OpenGL glew库找到这个纯英文网站,尽量不要去下别人提供的文件一是版本跟不上,也有可能会缺些东西,还是去官方提供的好.点击glew在开头找到LIBRARY然后GLEW再是Download下的Glew Web Site,点进去之后下面会有一排下载链接从上到下版本越低,建议用最新的.一是可能你在网上找别人的代码Ctrl C+V结果有些函数不能用

Xamarin.iOS开发初体验

Xamarin是一个跨平台开发框架,这一框架的特点是支持用C#开发IOS.Android.Windows Phone和Mac应用,这套框架底层是用Mono实现的. Mono是一款基于.NET框架的开源工程,包含C#语言编译器.CLR运行时和一组类库,能运行于Windows.Linux.Unix.Mac OS和Solaris.对于.NET程序员来说,Xamarin是走向安卓.iOS.Mac跨平台开发的神器,不仅能用熟悉的C#来开发,还能使用Visual Studio作为IDE.本文内容是Xamar

Shell脚本编程初体验

Shell脚本编程初体验 分类 编程技术 通 常,当人们提到"shell脚本语言"时,浮现在他们脑海中是bash,ksh,sh或者其它相类似的linux/unix脚本语言.脚本语言是与计算机 交流的另外一种途径.使用图形化窗口界面(不管是windows还是linux都无所谓)用户可以移动鼠标并点击各种对象,比如按钮.列表.选框等等.但 这种方式在每次用户想要计算机/服务器完成相同任务时(比如说批量转换照片,或者下载新的电影.mp3等)却是十分不方便.要想让所有这些事情变得简单并 且自动

Linux初体验(一)

Linux初体验(一) Shell date echo alias screen 安装VMware Tools Shell 用途说明 人机交互接口 Shell是Linux系统的用户界面,是用户操作Linux系统的一个直接工具,亦即人机交互接口,其既为用户提供了一个命令界面,也为用户命令提供解释执行的能力,故而Shell也称为Linux的命令解释器(command interpreter). 在Shell中可执行的命令分为两类,内置命令与外部命令,所谓内置命令,即shell自带的命令,可通过命令启

Windows Azure 初体验

最近看到windows azure 在做活动,只需花一块钱就可以体验一个月的windows azure. 于是,我就注册了一个账号也尝试一把云时代,传送门. 注册很简单的,成功后可以看到这个界面. 然后,我就研究了一下怎么把网站发布到云上,在此分享一下.网站是简单的基于asp.net mvc + code first 比较简单. 首先新建一个asp.net mvc 的网站.在此我命名为 WindowsAzureMVC,为了支持code first 需要添加entity framework 的dl

wxWidgets初学者导引(3)——wxWidgets应用程序初体验

wxWidgets初学者导引全目录   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wxSmith进行可视化设计附:学习材料清单 3 wxWidgets应用程序初体验 本文中所有的体验,在Code::Blocks中进行. 为了在Code::Blocks中编译运行C++写的wxWidgets程序,需要再做些设置. 首先,需要在环境变量里添加一个wxWidgets根目录环境变量.设置方法类似于2.3

软件测试学习笔记week 3 --- 测试框架初体验

测试框架初体验 在这周的软件测试课上,第一次了解了软件测试框架的概念.软件测试框架包含的范围非常广,从自动化测试框架到单元测试框架以及性能测试框架.在上个寒假中,在学习Coursera的在线课程时发现普林斯顿的单元测试做得非常强大,从程序正确性到Time consuming甚至Memory consuming,几乎能发现程序中的每一处错误或者缺陷.因此,在上完了这周的课程后,我查阅了一些资料,做了这篇随笔记录了解到的单元测试的知识. 一.什么是测试框架 要认识测试框架,首先要对所谓框架有概念.框

Node.js 网页瘸腿爬虫初体验

延续上一篇,想把自己博客的文档标题利用Node.js的request全提取出来,于是有了下面的初哥爬虫,水平有限,这只爬虫目前还有点瘸腿,请看官你指正了. // 内置http模块,提供了http服务器和客户端功能 var http=require("http"); // 内置文件处理模块 var fs=require('fs'); // 创建一个将流数据写入文件的WriteStream对象 var outstream=fs.createWriteStream('./1.txt'); /

Swift初体验之HelloWord+苹果Swift编程语言入门教程【中文版】

AppDelegate.swift : <span style="font-size:24px;"><strong>// // AppDelegate.swift // SwiftHelloWord // // Created by jason on 14-6-5. // Copyright (c) 2014年 JasonApp. All rights reserved. // import UIKit @UIApplicationMain class AppD