[Modern OpenGL系列(二)]创建OpenGL窗口
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51295663
在博主的上一篇文章中已经介绍了OpenGL开发环境的搭建,本篇博文将验证开发环境是否搭建成功。同时,也是迈出OpenGL开发的第一步。我们使用上一篇文章中新建的项目,创建一个OpenGL窗口。
- 添加头文件
display.h。#include <SDL2\SDL.h>
#include <string> class Display
{
public:
Display(int width, int height, const std::string& title); void Clear(float r, float g, float b, float a);
void Update();
bool IsClosed(); virtual ~Display(); protected:
private:
Display(const Display& other) {}
Display& operator=(const Display& other) {} SDL_Window* m_window;
SDL_GLContext m_glContext;
bool m_isClosed;
};
- 添加显示类
display.cpp.#include "display.h"
#include <GL\glew.h>
#include <iostream> Display::Display(int width, int height, const std::string& title)
{
SDL_Init(SDL_INIT_EVERYTHING); SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);// 设置颜色的四个分量所占用内存为8bit
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); m_window = SDL_CreateWindow(title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_OPENGL);
m_glContext = SDL_GL_CreateContext(m_window); GLenum status = glewInit(); if (status != GLEW_OK)
{
std::cerr << "Glew failed to initialize" << std::endl;
} m_isClosed = false;
} Display::~Display()
{
SDL_GL_DeleteContext(m_glContext);
SDL_DestroyWindow(m_window);
SDL_Quit();
} void Display::Clear(float r, float g, float b, float a)
{
glClearColor(r, g, b, a);// 设置窗口背景色
glClear(GL_COLOR_BUFFER_BIT);// 清除颜色缓冲
} bool Display::IsClosed()
{
return m_isClosed;
} void Display::Update()
{
SDL_GL_SwapWindow(m_window); SDL_Event e; while (SDL_PollEvent(&e))
{
if (e.type == SDL_QUIT)
{
m_isClosed = true;
}
}
}
- 在
main函数中调用显示方法。具体代码如下:#include <GL\glew.h>
#include "display.h" int main(int argc, char** argv)
{
Display display(400, 300, "hello world!"); while (!display.IsClosed())
{
display.Clear(0.0f, 1.0f, 0.0f, 1.0f); display.Update();// 刷新
} return 0;
}
- 运行项目。可以使用快捷键
F5来运行项目。运行后会显示一个绿色的OpenGL窗口。如图:
- 注意:如果
main方法没有参数,则会报错:SDL2main.lib(SDL_windows_main.obj) : error LNK2019: 无法解析的外部符号 _SDL_main,该符号在函数 _main_utf8 中被引用,所以main方法的签名必须是int main(int argc, char** argv)。- 本文中的项目使用的是VS2015,建议是用VS2015打开。点此下载源码
- 本文整理自YouTube视频教程#2 Intro to Modern OpenGL Tutorial: OpenGL Windows
声明:本文欢迎转载和分享,但是请尊重作者的劳动成果,转载分享时请注明出处:http://www.cnblogs.com/davidsheh/p/5452336.html 。同时,码字实在不易,如果你觉得笔者分享的笔记对你有点用处,请顺手点击下方的推荐,谢谢!
[Modern OpenGL系列(二)]创建OpenGL窗口的更多相关文章
- [转]用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口
原文链接: 1.用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口 2.Windows MFC 两个OpenGL窗口显示与线程RC问题
- Linux OpenGL 实践篇-2 创建一个窗口
OpenGL 作为一个图形接口,并没有包含窗口的相关内容,但OpenGL使用必须依赖窗口,即必须在窗口中绘制.这就要求我们必须了解一种窗口系统,但不同的操作系统提供的创建窗口的API都不相同,如果我们 ...
- arcgis api 3.x for js 入门开发系列二十一气泡窗口信息动态配置模板
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- 创建OpenGL Context(WGL)
创建OpenGL Context(WGL) 创建OpenGL Context是初始化OpenGL的一部分.只有在此之后才能使用OpenGL. 关于platform的注意事项 创建OpenGL cont ...
- OpenGL 使用GLFW创建全屏窗口
OpenGL 使用GLFW创建全屏窗口 GLFW库里面的glfwCreateWindow()函数是用来创建窗口的函数. 这样函数的原型是: GLFWwindow* glfwCreateWindow(i ...
- OpenGL(二)——函数库简述
简述 1. OpenGL用到的库分为OpenGL核心库.OpenGL实用库.OpenGL辅助库和OpenGL工具库(不是必须) 2. OpenGL核心库 核心库包含有115个函数,函数名的前缀为gl ...
- 【OpenGL游戏开发之二】OpenGL常用API
OpenGL常用API 开发基于OpenGL的应用程序,必须先了解OpenGL的库函数.它采用C语言风格,提供大量的函数来进行图形的处理和显示.OpenGL库函数的命名方式非常有规律.所有OpenGL ...
- openGL实现二维图形和三维图形
openGL是一个强大的底层图形库,其命令最初的时候使用C语言实现的.openGL定义了一个图形程序接口,常用于制作处理三维图像,功能强大,调用方便,在图像处理十分受欢迎. 实现图形主要使用的是ope ...
- VSTO之旅系列(二):创建Excel解决方案
原文:VSTO之旅系列(二):创建Excel解决方案 本专题概要 引言 创建VSTO项目 Excel对象模型 创建Excel外接程序 创建Excel文档级自定义项 小结 一.引言 也许很多朋友都没有听 ...
- OpenGL教程(2)——第一个窗口
OpenGL环境终于配置好了,现在我们可以开始学习OpenGL了. 首先,创建一个.cpp文件,然后打上几行#include指令: #include <iostream> using st ...
随机推荐
- asp.net pipeline完整图
- ASP.NET Web API 过滤器创建、执行过程(二)
ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...
- 适合WebApi的简单的C#状态机实现
目标 采用了Restful WebApi的架构,再把业务逻辑状态转移放到后端就有点违背初衷了.实际上只要后端Api的权限设置的好,把状态转移放到前端也未尝不可.我考虑的结果是,一般如果变更这个状态本身 ...
- Entity Framework 6 Recipes 2nd Edition(9-6)译->管理断开时的并发
9-6. 管理断开时的并发 问题 想要确保只接受在WCF客户端并发令牌未被修改的实体. 解决方案 我们有一个如Figure 9-6所示的模型. Figure 9-6订单实体模型 我们想通过WCF服务来 ...
- 基于HTTP的断点传输
最近项目需要做一个类似于迅雷的文件下载功能,这类需求可能比较常见,希望可以帮助到有需要的同学 要求: 1.支持断点传输 2. 多文件同时下载 3. 由于是客户内部试用,服务器只支持HTTP文件下载不支 ...
- Javascript刷题 》数组求和
计算给定数组 arr 中所有元素的总和 输入描述: 数组中的元素均为 Number 类型 输入例子: sum([ 1, 2, 3, 4 ]) 输出例子: 10 解题方法 1.定义一个变量,将前面的和后 ...
- 【.NET深呼吸】基于异步上下文的本地变量(AsyncLocal)
在开始吹牛之前,老周说两个故事. 第一个故事是关于最近某些别有用心的人攻击.net的事,其实我们不用管它们,只要咱们知道自己是.net爱好者就行了,咱们就是因为热爱.net才会选择它.这些人在这段时间 ...
- RXJava by Example--转
原文地址:https://www.infoq.com/articles/rxjava-by-example Key takeaways Reactive programming is a specif ...
- 学习JVM--垃圾回收(一)原理
1. 前言 Java和C++之间显著的一个区别就是对内存的管理.和C++把内存管理的权利赋予给开发人员的方式不同,Java拥有一套自动的内存回收系统(Garbage Collection,GC)简称G ...
- console.log("A"-"B"+"3")=?
(点击上方的订阅号,可快速关注,关注有惊喜哦^_^) 前不久看到一道JS基础题目,做了一下竟然错了一半...在此分享一下: 先把题目放上来,大家可以自己测试一下再看答案哦^_^ ①console.lo ...