我的第一个OpenGL程序
前言
本文开始记录opengl(开放图形库)的学习,从编译opengl的环境配置,到实现第一个程序的运行(利用SDL创建一个可以绘制图形的窗口)。
基于Windows的opengl环境配置
有了解过前人学习opengl的经验,发现不同的版本所需要的依赖库并不相同,但是其实没有关系,因为需要用到相应的API再去下载配置也一样。opengl运行需要至少两个库,一个提供窗口环境,一个提供OpenGL profile加载,据了解红宝书(opengl编程指南)是glut+flew,蓝宝书(OpenGL超级宝典)是glfw+GL3w 。因为本人一开始是跟着一个视频教程去学习的,后面才准备了opengl的红宝书。现在将我的环境配置经验分享出来。
(1)下载相应的SDK,以下是我使用的SDK以及相应的下载地址:
glew:https://www.opengl.org/sdk/libs/
glm:https://www.opengl.org/sdk/libs/
SDL2:https://www.libsdl.org/download-2.0.php
(2)配置opengl环境
首先新建一个控制台应用
进入新建的项目,将源文件以及资源文件删除
将下载解压好的SDK导入项目文件,如下操作:
1.在项目文件夹下创建include以及lib文件夹
将glew下include下的GL拷贝到项目文件夹下创建的include中:
因为本项目是在x86的编译环境中运行的,所以选择glew下lib的Win32中的两个lib文件拷贝到项目中的lib文件夹
将glew32.dll拷贝到项目中与.exe的同级目录下,如下图所示:
2.将glm按照以上的步骤导入,glm拷贝到项目文件夹下的include中,
3.将SDL也导入
将整个include文件夹拷贝到项目文件夹的include中,改名为SDL2
将SDL的lib文件以及dll导入
4.在VS中添加相应的项目依赖库
右击项目属性,选择C/C++的常规,添加包含目录,如下图
选择链接器常规,添加库目录
选中链接器输入,添加依赖项,将项目lib文件夹下的lib文件命复制过来就好
经过以上的步骤,一个初始的opengl编程环境已经搭建完成了。
第一个opengl程序
(1)在资源文件下创建以下三个文件:
main.cpp代码:
#include<iostream>
#include<GL/glew.h>
#include"Display.h"
int main(int argc,char ** argv)
{
Display display(800, 800,"OpenGLWindows");
while (!display.IsClosed())
{
glClearColor(0.0f,0.15f,0.3f,1.0f);
glClear(GL_COLOR_BUFFER_BIT);
display.Update();
}
return 0;
}
Display.h代码:
#pragma once
#include <string>
#include <SDL2/SDL.h>
class Display
{
public:
Display(int width, int height, const std::string&title);
void Update();
bool IsClosed();
Display();
protected:
private:
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);
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 Init failure" << std::endl;
}
m_isClosed = false;
}
Display::Display()
{
SDL_GL_DeleteContext(m_glContext);
SDL_DestroyWindow(m_window);
SDL_Quit();
}
//用于交换内存缓存区
void Display::Update()
{
SDL_GL_SwapWindow(m_window);
SDL_Event e;
while (SDL_PollEvent(&e))
{
if (e.type==SDL_QUIT)
{
m_isClosed = true;
}
}
}
bool Display::IsClosed()
{
return m_isClosed;
}
运行效果:
因为本人也是初学者,所以要是有不对的地方有劳各位大佬指正。