前言
OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。
OpenGL 是行业领域中最为广泛接纳的 2D/3D 图形 API,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。OpenGL是独立于视窗操作系统或其它操作系统的,亦是网络透明的。在包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGL帮助程序员实现在 PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。
1.使用VS的插件配置OpenGL库
1.1打开vs创建一个C++项目(Windows 桌面应用程序)
1.2下载nupengl库
项目—管理Nuget程序包—浏览—在搜索栏输入NupenGL
2.编写OpenGL程序
2.1 ggl.h(引入相关库)
#pragma once
#include<windows.h>
#include<gl/freeglut.h>
//如果没有这个库 就从网上下载一个 放进gl目录下
#include<stdio.h>
#include<math.h>
//c中的字符串库
#include<string.h>
//c++中的字符串库
#include<string>
#include<sstream>
#include<vector>
//用来使用Lambda表达式等操作
#include<functional>
2.2 scene.h(OpenGL方法声明头文件)
#pragma once
#include "ggl.h"
//3D场景初始化
void Init();
//绘制
void Draw();
}
2.3 main.c(用来打开Windows窗口)
#include "scene.h"
#pragma comment(lib,"opengl32.lib")
LRESULT CALLBACK GLWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg)
{
case WM_CLOSE:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR IpCmdLine, int nShowCmd) {
WNDCLASSEX wndclass;
wndclass.cbClsExtra = 0;
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.cbWndExtra = 0;
wndclass.hbrBackground = NULL;
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hIcon = NULL;
wndclass.hIconSm = NULL;
wndclass.hInstance = hInstance;
wndclass.lpfnWndProc = GLWindowProc;
wndclass.lpszClassName = L"GLWindow";
wndclass.lpszMenuName = NULL;
wndclass.style = CS_VREDRAW | CS_HREDRAW;
ATOM atom = RegisterClassEx(&wndclass);
if (!atom) {
MessageBox(NULL, L"Register Fail", L"Error", MB_OK);
return 0;
}
RECT rect;
rect.left = 0;
rect.right = 800;
rect.top = 0;
rect.bottom = 600;
AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, NULL);
int windowWidth = rect.right - rect.left;
int windowHeight = rect.bottom - rect.top;
HWND hwnd = CreateWindowEx(NULL, L"GLWindow", L"OpenGL Window", WS_OVERLAPPEDWINDOW,
100, 100, windowWidth, windowHeight,
NULL, NULL, hInstance, NULL);
//1.选定像素格式
HDC dc = GetDC(hwnd);
PIXELFORMATDESCRIPTOR pfd;
memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
pfd.nVersion = 1;
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.cColorBits = 32;
pfd.cDepthBits = 24;
pfd.cStencilBits = 8;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
int pixelFormat = ChoosePixelFormat(dc, &pfd);
SetPixelFormat(dc, pixelFormat, &pfd);
HGLRC rc = wglCreateContext(dc);
wglMakeCurrent(dc, rc);
//2.创建渲染环境
Init();
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
MSG msg;
while (true) {
if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE)) {
if (msg.message == WM_QUIT) {
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//3.绘制
Draw();
SwapBuffers(dc);
}
return 0;
}
2.4 scene.c(OpenGL绘制主程序)
#include "scene.h"
void Init() {
//将当前矩阵设置为投影矩阵
glMatrixMode(GL_PROJECTION);
/*
参数1:你看世界垂直方向的视角
参数2:是画布宽与高的比
参数3:是你最近可以看到的距离
参数4:是你最远可以看到的距离
*/
gluPerspective(50.0f, 800.0f / 600.0f, 0.1f, 1000.0f);
//模型矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
//设置点的顺序为为逆时针
//正面;它们的点连接为逆时针方向
//反面:它们的点连接为顺时针方向
void Draw() {
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
//设置当前点颜色
glColor4ub(255, 255, 255, 255);
//当前点为白色
glVertex3f(-0.2f, -0.2f, -1.5f);
glColor4ub(255, 0, 0, 255);
//当前点为红色
glVertex3f(0.2f, -0.2f, -1.5f);
glColor4ub(0, 255, 0, 255);
//当前点为红色
glVertex3f(0.0f, 0.2f, -1.5f);
glEnd();
}