OpenGL边用边学------1 VS2015最简单OpenGL设置代码

2024-01-13 23:58

本文主要是介绍OpenGL边用边学------1 VS2015最简单OpenGL设置代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 使用VS设置向导建立Win32应用程序框架
  • 包含必要的头文件链接必要的库文件
  • 初始化OpenGL渲染环境执行最简单渲染

Windows平台下开发OpenGL程序,最常用的还是使用VS环境,glut并不常用。作为《OpenGL边用边学》开篇第一文,先解决在VS环境下设置OpenGL的问题。

1. 使用VS设置向导,建立Win32应用程序框架

这个步骤不再多说了,鼠标点几下就可以完成。完成之后编译运行,确保自动生成的项目可用。

2. 包含必要的头文件,链接必要的库文件

在stdafx.h中增加如下代码。

#include <gl/GL.h>
#include <gl/GLU.h>#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")

3. 初始化OpenGL渲染环境,执行最简单渲染

修改窗口过程WndProc(),增加WM_CREATEWM_PAINT消息的处理,一个用来初始化OpenGL环境,另一个用来实际OpenGL绘图操作。

//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    处理主窗口的消息。
//
//  WM_COMMAND  - 处理应用程序菜单
//  WM_PAINT    - 绘制主窗口
//  WM_DESTROY  - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message){case WM_CREATE:OnCreate(hWnd, message, wParam, lParam);break;case WM_COMMAND:{int wmId = LOWORD(wParam);// 分析菜单选择: switch (wmId){case IDM_ABOUT:DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);break;case IDM_EXIT:DestroyWindow(hWnd);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}}break;case WM_PAINT:OnPaint(hWnd, message, wParam, lParam);::ValidateRect(hWnd, NULL);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;
}

WM_CREATE消息处理函数如下,功能就是初始化窗口的OpenGL渲染环境。

void OnCreate(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{static PIXELFORMATDESCRIPTOR pfd = {sizeof(PIXELFORMATDESCRIPTOR),1,PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,PFD_TYPE_RGBA,24,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,PFD_MAIN_PLANE,0,0,0,0};HDC hdc = ::GetDC(hWnd);int pixelFormat = ::ChoosePixelFormat(hdc, &pfd);if (!::SetPixelFormat(hdc, pixelFormat, &pfd)) {::ReleaseDC(hWnd, hdc);MessageBox(hWnd, L"SetPixelFormat", L"ERROR", MB_OK);return;}HGLRC hrc = ::wglCreateContext(hdc);if (!::wglMakeCurrent(hdc, hrc)) {::ReleaseDC(hWnd, hdc);::wglDeleteContext(hrc);MessageBox(hWnd, L"wglMakeCurrent", L"ERROR", MB_OK);return;}::ReleaseDC(hWnd, hdc);
}

WM_PAINT消息处理函数如下,功能是清空颜色缓冲区,并交换前后缓存,从而更新显示。

void OnPaint(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{glClear(GL_COLOR_BUFFER_BIT);HDC hdc = ::GetDC(hWnd);::SwapBuffers(hdc);::ReleaseDC(hWnd, hdc);
}

至此最简单的Win32+OpenGL程序框架就完成了。运行后窗口客户区显示为黑色,如下图:

OpenGL最简单框架

源码下载

这篇关于OpenGL边用边学------1 VS2015最简单OpenGL设置代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/603229

相关文章

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim