OpenGL入门demo

news2024/10/7 10:15:08

开发环境visual studio 2022 preview版本,x64版本

安装OpenGL

首先OpenGL是windows系统里面自带的,我们可以不用去下载最新版。直接在此基础上配置OpenGL的三个扩展库glew,glfw,flut就可以了。

下载OpenGL的开发依赖类库:

官方glew下载地址:https://sourceforge.net/projects/glew/

官方glfw下载地址:https://www.glfw.org/download.html

官方glut下载地址:https://www.opengl.org/resources/libraries/glut/glut_downloads.php#3.6

如果不是专业搞 openGL ,只是学习一下,我这里已经给大家打包好了。按照接下来的操作步骤走保准没问题。

链接:https://pan.baidu.com/s/1izkpW-vdzIpgV0qVt5KK9Q

提取码:8uqf

第一步:创建一个c++的控制台应用程序

平台选为x64平台

第二步:将百度网盘里面下载的文件,放到项目的根目录。

第三步:配置vs开发环境

1.将glew,glfw,glut的头文件添加进来,操作流程,点击常规,附加包含目录,添加include文件。

2.点击左边的 “链接器”,再点击 “附加库目录” ,把 glew、glfw、glut 的库目录添加进去。操作过程如图所示:

3.点击左边的 “链接器”,再点击 “输入” ,把 glew、glfw、glut的 库目录链接 手敲进去。

【注意:一定要保证“glut32.lib” 在前,“glut.lib”在后。

opengl32.lib

glew32s.lib

glfw3.lib

glut32.lib

glut.lib

最后保存应用,visual studio 里面的环境就配置完毕了。

4.打开项目文件后,点开 “OpenGLDll”,在里面找到 “glew32.dll、glew32.dll、glut.dll、glut32.dll”,并分别复制它们四个, 粘贴位置 要求和 源码 在同一个目录下! 如图所示:

【注意:glfw 的 .dll文件 要选相应的版本才行,因为我用的VS2022,所以选的是lib-vc2022文件夹里面的 .dll文件】

环境到这里就搭建完毕了,写一个demo试试环境是否正确吧。

#include <iostream>        
using namespace std;
#define GLEW_STATIC     
#include <GL/glew.h>    
#include <GLFW/glfw3.h> 
const GLint WIDTH = 800, HEIGHT = 600;        // 先设置窗口以及其大小                                
int main()
{    
    glfwInit();                                //初始化,使用glfw来打开一个窗口
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);            
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);                                                            
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);    
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);    
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);                        // 缩放窗口的关闭
    GLFWwindow* window_1 = glfwCreateWindow(WIDTH, HEIGHT, "Hello, friend! I'm a openGL window!", nullptr, nullptr);  
    int screenWidth, screenHeight;
    glfwGetFramebufferSize(window_1, &screenWidth, &screenHeight);  // 获得实际占用的帧缓存大小
    if (nullptr == window_1)            //判断窗口输出是否成功
    {
        cout << "Failed to create GLFW window" << endl;
        glfwTerminate();    
        return -1;          
    }
    glfwMakeContextCurrent(window_1);   // 捕获当前窗口,准备对当前窗口进行画图
    glewExperimental = GL_TRUE;            
    if (glewInit() != GLEW_OK)            // 判断glew初始化是否成功
    {
        cout << "Failed to initialise GLEW" << endl;
        glfwTerminate();            
        return -1;
    }
    glViewport(0, 0, screenWidth, screenHeight);    // 设置视口的大小
    while (!glfwWindowShouldClose(window_1))        
    {
        glfwPollEvents();                        
        glClearColor(0.1f, 0.8f, 0.7f, 1.0f);        // 分别是红、绿、蓝、透明度的四个参数。RGB三原色+透明度
        glClear(GL_COLOR_BUFFER_BIT);            
        glfwSwapBuffers(window_1);                    // 双缓存模式
    }
    glfwTerminate();                                // 如果循环结束:glfw关闭
    return 0;
}

这是一个运行出来的效果。

补充一个便于学习的 详细注释版代码:【功能和简易版相同】

#include <iostream>        // C++的标准输入输出头文件
using namespace std;

#define GLEW_STATIC     // 预定义:把 glew 这个库放到系统文件夹里面(STATIC:能找到静态库就优先使用静态库)
                        // 由静态库导出或从静态库导入的函数的签名用关键字 export .从动态库导入的功能必须用 extern __declspec(dllimport).GLEW_STATIC是激活第一种情况的预处理器定义.

#include <GL/glew.h>    // 包含“GL”文件夹里面的“glew.h”的头文件
                        // 程序运行到这一段后,先找到“GL”文件,打开后找到“glew.h”头文件,然后
                        // 会在“编译”的时候把里面的整段代码复制到下面,只是没有显示出来

#include <GLFW/glfw3.h> // 我们需要和不同的操作系统进行交互,则需要“glfw.h”的头文件
                        // 先创建一个窗口,然后在窗口里面创建一个“视口”

const GLint WIDTH = 800, HEIGHT = 600;        // 先设置窗口以及其大小
                                            // 在openGL里面,数据类型名字前面都有个大写的“GL”,所以“GLint”其实内涵就是“整型int”的意思
                                            // 而openGL里面的函数都以小写的“gl”开头
int main()
{    

    /*
        说明:
            glfw 提供的是环境(变量名或函数名以“glfw”或“GLFW”开头的都是)
            glew 用来绘图(变量名或函数名以“glew”或“GLFW”开头的都是)
    */ 

    glfwInit();   //初始化,使用glfw来打开一个窗口

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);        // 设置窗口版本,“MAJOR”代表主版本号

    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);        // 设置窗口版本,“MAJOR”代表副版本号
                                                        
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);    // GLFW_OPENGL_PROFILE用告诉窗口,这个版本是为了openGL 做准备的。
                                                                    // openGL用的版本用“CORE_PROFILE”来表示,指的是3.1以后的版本 新版的

    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);    // 苹果系统需要加这条语句(Windows可加可不加)。函数作用:向前面的版本兼容

    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);                //缩放窗口的关闭

    GLFWwindow* window_1 = glfwCreateWindow(WIDTH, HEIGHT, "Hello, friend! I'm a openGL window!", nullptr, nullptr);  
    // 新建一个窗口,"一支王同学再在此出没!"(第三个参数):设置窗口名字

    //  开始为高清屏做设置
    int screenWidth, screenHeight;
    glfwGetFramebufferSize(window_1, &screenWidth, &screenHeight);  // 获得实际占用的帧缓存大小。帧的宽传给screenWidth;帧的高传给screenHeight。
    
    if (nullptr == window_1)    //判断窗口输出是否成功,失败则给出一段提示
    {
        cout << "Failed to create GLFW window" << endl;
        glfwTerminate();        // glfw关闭
        return -1;                // 进程结束
    }

    glfwMakeContextCurrent(window_1);   // 捕获当前窗口,准备对当前窗口进行画图

    glewExperimental = GL_TRUE;            // 如果程序编译的时候说有问题的时候,再打开这条语句(以前解决问题的一条语句)

    if (glewInit() != GLEW_OK)            // 判断glew初始化是否成功,看返回值是否成功 失败则给出一段提示
    {
        cout << "Failed to initialise GLEW" << endl;
        glfwTerminate();                // 关闭glfw
        return -1;
    }

    glViewport(0, 0, screenWidth, screenHeight);    // 设置视口的大小(帧缓存的大小传进去)
                                                    // 原函数声明: glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
                                                    // (x ,y)代表视口(正方形)的左下角的坐标。width、height分别代表视口的宽和高

    while (!glfwWindowShouldClose(window_1))        // 只要当前窗口不关闭,一直执行这个循环
    {
        glfwPollEvents();                            // 事件相应的命令,作用:捕获所有的事件。

        glClearColor(0.1f, 0.8f, 0.7f, 1.0f);        // 分别是红、绿、蓝、透明度的四个参数。RGB三原色+透明度(1.0表示不透明,0.1表示完全透明)
                                                    // 一般电脑的RGB显示的都是8位,能表示256*256*256=16777216色

        glClear(GL_COLOR_BUFFER_BIT);                // glClear():使用 glClearColor 中指定的值设定颜色缓存区的值,即将窗口中的每一个像素设置为背景色GL_COLOR_BUFFER_BIT
        
        glfwSwapBuffers(window_1);                    // 打开双缓存模式(进阶知识),相当于拿出两块“画板”(一块画好的展示在你面前,另一块接着画,反正画好才给你看)
    }

    glfwTerminate();   // 如果循环结束:glfw关闭

    return 0;
}

程序源代码的demo

链接:https://pan.baidu.com/s/1bSHA7pir3Ycvx3bgweBjqg

提取码:wack

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/365978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【java】Spring Cloud --Spring Cloud Alibaba 微服务解决方案

文章目录1、Spring Cloud Alibaba 是什么先说说 Spring CloudSpring Cloud Alibaba和Spring Cloud 的区别和联系Spring Cloud Alibaba2、Spring Cloud Alibaba 包含组件阿里开源组件阿里商业化组件集成 Spring Cloud 组件3、Spring Cloud Alibaba 功能服务注册与发现支持多协议…

python-剑指 Offer 42. 连续子数组的最大和【动态规划经典题解】

一.题目 剑指 Offer 42. 连续子数组的最大和 描述&#xff1a;输入一个整型数组&#xff0c;数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 示例1: 输入: nums [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2…

html初识

HTML认知 文章目录HTML认知语法规范注释标签组成和关系标签的关系标签学习排版系列标签**标题标签****段落标签**换行标签水平线标签文本格式化标签媒体标签图片标签src 目标图片的路径alt 替换文本title 图片的标题width 宽度 / height 高度路径绝对路径相对路径&#xff08;常…

feature分支开发到一半时切换到bugfix分支,如何暂存数据

1、解决思路在工作过程中&#xff0c;当你正在当前feature分支上进行功能的开发&#xff0c;突然来了一个bug&#xff0c;要创建一个bugfix修复分支进行修复。但是当前feature分支你只开发了一半&#xff0c;显然你去提当前的半成品是不合适的&#xff0c;我们如何处理此类问题…

面试题-----JDBC单例模式(懒汉式和饿汉式)

1.单例概念 作为一种常见的设计模式&#xff0c;单例模式的设计概念是"两个私有,一个公有",即私有属性/成员变量和私有构造,以及公有方法,常用于在整个程序中仅调用一次的代码。 2.具体操作 从单例模式的描述来看,单例模式并不能用于多次频繁调用的设计中,而更适用…

【Linux】进程状态|优先级|进程切换|环境变量

文章目录1. 运行队列和运行状态2. 进程状态3. 两种特殊的进程僵尸进程孤儿进程4. 进程优先级5. 进程切换进程特性进程切换6. 环境变量的基本概念7. PATH环境变量8. 设置和获取环境变量9. 命令行参数1. 运行队列和运行状态 &#x1f495; 运行队列&#xff1a; 进程是如何在CP…

如何在Net6.0里配置多版本支持并支持注释说明的Swagger

一、前言现在已经进入了微服务的开发时代了&#xff0c;在这个时代&#xff0c;如果有人问你什么是微服务&#xff0c;你说不知道&#xff0c;就有点太丢人了&#xff0c;别人会有异样的眼光看你&#xff0c;俗话说&#xff1a;唾液淹死人。没办法&#xff0c;我们只能去学习新…

一款 Linux、数据库、Redis、MongoDB 统一管理平台,这个开源平台非常好用!

一、开源项目简介基于DDD分层实现的web版 linux(终端 文件 脚本 进程)、数据库&#xff08;mysql postgres&#xff09;、redis(单机 集群)、mongo统一管理操作平台二、开源协议使用Apache-2.0开源协议三、界面展示&#xff08;系统核心功能截图&#xff09;四、服务部署&#…

Windows 平台 oracle11g 单机 打补丁(33883353)

一、从oracle官网下载最新补丁包和打包工具 二、 对数据库及软件作全备 略 三、解压p33883353_112040_MSWIN-x86-64.zip 在33883353文件夹中打开README.html 2.1 OPatch Utility You must use the OPatch utility version 11.2.0.3.34 or later to apply this patch. 必须…

Maven 依赖-镜像仓库替换为 -- 阿里云镜像仓库(飞快实现 pom 引入)

在本地 maven 的 setting 配置文件中加上阿里云镜像地址就行了&#xff1a;新增配置内容&#xff1a;<!-- 阿里镜像仓库 --><mirrors><mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus…

高项--十大管理、47个过程、五大过程组

十大管理、47个过程、五大过程组【联想记忆】 文章目录 十大管理、47个过程、五大过程组【联想记忆】 十大管理 1.十大管理是哪几个&#xff1f; 2.十大管理记忆口诀&#xff1a; 3.各大管理记忆口诀&#xff1a; 4.十大管理、十大管理的47个过程、47个过程所属的五大过程组&a…

一篇文章搞定linux网络模型

网络协议感觉晦涩难懂&#xff1f;什么七层网络模型&#xff1f;又五层网络模型&#xff1f;又四层网络模型&#xff1f;TCP/IP协议是个啥&#xff1f;UDP是啥&#xff1f;什么是三次握手&#xff1f;什么是四次挥手&#xff1f;tcpdump听说是抓包的&#xff0c;怎么用&#xf…

期末综合考试

一、概率论1、全概率公式、贝叶斯公式应用2、期望、方差、协方差的定义以及性质证明(1) 期望(2) 方差(3) 协方差二、数理统计1、参数估计(1) 矩估计(2) 最大似然估计(3) 综合例题一、概率论 1、全概率公式、贝叶斯公式应用 记住标黄的两段&#xff0c;上考场直接套数据&#x…

相交链表【2.23】

题目&#xff1a;给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;…

SYSU程设c++(第一周) io流、命名空间、引用

理论题&#xff1a; 1.std::cout<<0a; 的输出是97 &#xff08;0转换了类型成int&#xff0c;‘a变成askll码&#xff09; 2.std::cout<<0"12.34";的输出是12.34 &#xff08;0无用&#xff0c;忽略) 3.std::cout<<1"12.34";则编译错…

批量修改word中的表格属性

背景&#xff1a;写接口文档&#xff0c;程序导出的接口文档格式不符合标书的需要&#xff0c;要批量设置word表格及文本————————————————————————————————方法&#xff1a;我们可以通过word的宏观能&#xff0c;实现批量设置。1说明&#xff…

表格内容过多时单行/多行显示

分析 单行多行显示涉及到 table-layout: fixed; 这个属性&#xff0c;默认状态下的属性值是 auto &#xff08;自动表格布局&#xff09;&#xff0c;两种不同的属性值区别如下&#xff1a; 方法 我在设置表格内容单行/多行显示时采用的方法&#xff1a; table 添加的样式&a…

JS - 原型对象、原型链是什么

一 阅读掘金 https://juejin.cn/post/7007416743215759373 https://juejin.cn/post/7007416743215759373 二 阅读掘金小册原型知识点 原型 涉及面试题&#xff1a;如何理解原型&#xff1f;如何理解原型链&#xff1f; 当我们创建一个对象时 let obj { age: 25 }&#xff0…

设备太分散?如何一站式管理边缘 OS、K8s 和应用?

作者简介 张志龙&#xff0c;SUSE 大中华区资深解决方案架构师&#xff0c;CNCF 官方认证的 CKA&CKAD 工程师&#xff0c;深耕以 Kubernetes 为代表的云原生领域&#xff0c;具备丰富的架构设计、业务容器化改造和项目落地实践经验。 据 Gartner 预测&#xff0c;到 2025 年…

【GlobalMapper精品教程】053:打开dbf文件并生成有坐标系的shp数据

本文讲解在globalmapper汇总打开dbf文件并生成有坐标系的shp数据。 文章目录一、dbf文件解读二、打开dbf文件二、另存为shp文件一、dbf文件解读 我们可以通过Excel或FME等多种软件查看dbf的结构&#xff0c;字段有&#xff1a;Name&#xff0c;kind&#xff0c;Lat&#xff0c…