前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++】OpenGL:freeglut环境配置与基础示例

【C++】OpenGL:freeglut环境配置与基础示例

作者头像
DevFrank
发布2024-07-24 14:46:45
870
发布2024-07-24 14:46:45
举报
文章被收录于专栏:C++开发学习交流

😏1. FreeGLUT介绍

FreeGLUT(Free OpenGL Utility Toolkit)是一个开源的替代性GLUT库,它提供了类似于GLUT的功能,并在其基础上进行了扩展和改进。FreeGLUT的目标是提供一个跨平台、功能丰富且易于使用的工具库,用于OpenGL程序开发。

下面是一些FreeGLUT库的特点和功能:

1.跨平台支持:FreeGLUT可以在多个操作系统上运行,包括Windows、Linux和Mac OS X等。这使得开发者可以使用相同的代码在不同平台上进行OpenGL程序开发。

2.窗口管理:FreeGLUT提供了创建窗口、处理窗口事件(如键盘和鼠标输入)、窗口大小调整等功能,使得开发者可以轻松管理和交互窗口。它还支持多个窗口和全屏模式。

3.用户输入处理:FreeGLUT提供了处理用户输入(键盘和鼠标)的接口。开发者可以通过注册回调函数来处理键盘按键、鼠标点击等事件,实现与用户的交互。

4.定时器:类似于GLUT,FreeGLUT也支持定时器功能。你可以通过设置回调函数实现定时执行某些操作,如动画效果、游戏循环等。

5.扩展功能:FreeGLUT通过增加一些额外的功能来扩展原始的GLUT库。例如,它支持菜单和子菜单的创建和管理,支持鼠标滚轮事件、支持多种输入设备等。

😊2. 环境安装与配置

下载链接:https://packages.msys2.org/package/mingw-w64-x86_64-freeglut

可以在这里下载基于mingw64编译的freeglut库,然后在clion里cmake配置项如下:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.19)
project(opengl_demo)

set(CMAKE_CXX_STANDARD 14)

include_directories("./env/include")
link_directories("./env/lib")

add_executable(opengl_demo main.cpp glad.c)
target_link_libraries(opengl_demo
        glfw3
        opengl32
        freeglut
        glu32
)

😆3. 应用示例

点创建示例:

代码语言:javascript
复制
#include <windows.h>
#include <GL/glut.h>

void init()
{
    glClearColor(0.0, 0.0, 0.0, 0.0);	//backgroud color(RGB(0,0,0-black;)+透明度)
    glMatrixMode(GL_PROJECTION);	//projection_mode
    glLoadIdentity();
    gluOrtho2D(-100, 100, -100, 100);	//显示范围
}

void myPoints()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glPointSize(3);
    glBegin(GL_POINTS);	//开始
    // points start
    glColor3f(1.0, 0.0, 0.0);	//red
    glVertex2i(-3, 3);
    glColor3f(0.0, 1.0, 0.0);	//green
    glVertex2i(10, 20);
    glColor3f(0.0, 0.0, 1.0);	//blue
    glVertex2i(0, -15);
    // points end
    glEnd();	//结束
    glFlush();	//渲染
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(200, 300);
    glutInitWindowSize(300, 300);
    glutCreateWindow("Display Points on opengl1");

    init();	//初始化
    glutDisplayFunc(myPoints);	//回调函数(导入参数)
    glutMainLoop();

    return 0;
}

创建五角星示例:

代码语言:javascript
复制
#include <iostream>
#include <gl/glut.h>

using namespace std;

struct Point {
    int x;
    int y;
};

//

#define VERTEX_COUNT 5

Point points[VERTEX_COUNT] = {
        103, 273,
        516, 273,
        184, 32,
        308, 452,
        439, 32
};

//

void draw_dda(Point p1, Point p2) {
    GLfloat dx = p2.x - p1.x;
    GLfloat dy = p2.y - p1.y;

    GLfloat x1 = p1.x;
    GLfloat y1 = p1.y;

    GLfloat step = 0;

    if(abs(dx) > abs(dy)) {
        step = abs(dx);
    } else {
        step = abs(dy);
    }

    GLfloat xInc = dx/step;
    GLfloat yInc = dy/step;

    for(float i = 1; i <= step; i++) {
        glVertex2i(x1, y1);
        x1 += xInc;
        y1 += yInc;
    }
}

void init() {
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glColor3f(0.0f, 0.0f, 0.0f);
    gluOrtho2D(0.0, 640.0, 0.0, 480.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glPointSize(1.0f);
}

void display() {
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POINTS);
    Point stPoint = points[0];

    for(int i = 1; i < VERTEX_COUNT; i++) {
        draw_dda(stPoint, points[i]);
        stPoint = points[i];
    }
    draw_dda(stPoint, points[0]);

    glEnd();
    glFlush();
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitWindowPosition(400, 200);
    glutInitWindowSize(640, 480);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutCreateWindow("OpenGL");
    init();
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

此外,可以参考该项目:https://github.com/sprintr/opengl-examples,提供了一些glut示例。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 😏1. FreeGLUT介绍
  • 😊2. 环境安装与配置
  • 😆3. 应用示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档