ubuntu 1604 配置OpenGL(SDL2+glfw+glad+glm+stb_image.h+Assimp)

全家桶安装包(懒得自己一个个找地方下载的可以直接下):SDL2+glfw+glad+glm+stb_image.h+Assimp

1、依赖安装:

sudo apt-get install build-essential
sudo apt-get install libglfw3-dev
sudo apt-get install cmake xorg-dev 
sudo apt-get install libgl1-mesa-dev

2、GLUT

sudo apt-get install libglut-dev

OpenGL Utility Toolkit 是建立在 OpenGL Utilities 上面的工具箱,除了强化了 OpenGL Utilities 的不足之外,也增加了 OpenGL 对于视窗介面支援。
注意:在这一步的时候,可能会出现以下情况,shell提示:

    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    E: Unable to locate package libglut-dev

将上述$ sudo apt-get install libglut-dev命令改成$ sudo apt-get install freeglut3-dev即可:

sudo apt-get install freeglut3-dev

3、GLFW
到GLFW官网下载3.3版本 官网

unzip glfw-3.3.zip
cd glfw-3.3
mkdir build
cd build
#这里默认cmake是编译静态库的,故添加-DBUILD_SHARED_LIBS=ON使其编译动态库
cmake ../ -DBUILD_SHARED_LIBS=ON
make
sudo make install

4、GLAD
打开GLAD的在线服务 在线服务
在这里插入图片描述
将语言(Language)设置为C/C++,在API选项中,选择3.3以上的OpenGL(gl)版本(我们的教程中将使用3.3版本,但更新的版本也能正常工作)。之后将模式(Profile)设置为Core,并且保证生成加载器(Generate a loader)的选项是选中的。现在可以先(暂时)忽略拓展(Extensions)中的内容。都选择完之后,点击生成(Generate)按钮来生成库文件。

GLAD现在应该提供给你了一个zip压缩文件,包含两个头文件目录,和一个glad.c文件。将两个头文件目录(glad和KHR)复制到你的Include文件夹中(或者增加一个额外的项目指向这些目录),并添加glad.c文件到你的工程中。
或者将两个头文件目录(glad和KHR)复制到你的Include文件夹中(即/usr/local/include),并添加glad.c文件到稍后的工程中。

unzip glad.zip
cd glad/include
sudo cp -r glad KHR /usr/local/include/

5、GLM
GLM库从0.9.9版本起,默认会将矩阵类型初始化为一个零矩阵(所有元素均为0),而不是单位矩阵(对角元素为1,其它元素为0)。如果你使用的是0.9.9或0.9.9以上的版本,你需要将所有的矩阵初始化改为 glm::mat4 mat = glm::mat4(1.0f)。

windows
配置GLM:https://blog.csdn.net/Wonz5130/article/details/83116009

linux
中配置GLM:
到gitlab链接下载glm 0.9.8.0 版本
解压,进入glm 0.9.8.0 :
解压之后,直接用glm文件
要用到GLM直接#include头文件,如:
注意: 在qt中亲测glm会出现重声明问题,可以尝试换个glm版本

// GLEW
#include <glad/glad.h>
// GLFW
#include <GLFW/glfw3.h>
// GLM
#include <glm-master/glm/glm.hpp>
#include <glm-master/glm/gtc/matrix_transform.hpp>
#include <glm-master/glm/gtc/type_ptr.hpp>
// GL includes
#include "stb_image.h"
#include <locale>
#include <codecvt>

测试

// System Headers
#include <glad/glad.h>
#include <GLFW/glfw3.h>

// Standard Headers
#include <cstdio>
#include <cstdlib>
#include <iostream>

void framebuffer_size_callback(GLFWwindow* window, int width, int height);//回调函数原型声明
void processInput(GLFWwindow *window);

// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;

int main(int argc, char * argv[]) {

    //初始化GLFW
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#ifdef __APPLE__
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // uncomment this statement to fix compilation on OS X
#endif
    //创建一个窗口对象
    GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "FirstGL", NULL, NULL);
    if (window == NULL)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    //通知GLFW将我们窗口的上下文设置为当前线程的主上下文
    glfwMakeContextCurrent(window);
    //对窗口注册一个回调函数,每当窗口改变大小,GLFW会调用这个函数并填充相应的参数供你处理
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
    //初始化GLAD用来管理OpenGL的函数指针
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }

    //渲染循环
    while(!glfwWindowShouldClose(window))
    {
        // 输入
        processInput(window);

        // 渲染指令
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        // 检查并调用事件,交换缓冲
        glfwSwapBuffers(window);//检查触发事件
        glfwPollEvents();    //交换颜色缓冲
    }

    //释放/删除之前的分配的所有资源
    glfwTerminate();
    return EXIT_SUCCESS;
}

//输入控制,检查用户是否按下了返回键(Esc)
void processInput(GLFWwindow *window)
{
    if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}

// 当用户改变窗口的大小的时候,视口也应该被调整 
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    // 注意:对于视网膜(Retina)显示屏,width和height都会明显比原输入值更高一点。
    glViewport(0, 0, width, height);
}

将 glad.c 放在和该 main.cpp 在同一目录下, 编译:

g++ -o out main.cpp glad.c -lglfw3 -lGL -lm -lXrandr -lXi -lX11 -lXxf86vm -lpthread -ldl -lXinerama -lXcursor

6、stb_image.h
使用纹理之前要做的第一件事是把它们加载到我们的应用中。纹理图像可能被储存为各种各样的格式,每种都有自己的数据结构和排列,所以我们如何才能把这些图像加载到应用中呢?一个解决方案是选一个需要的文件格式,比如.PNG,然后自己写一个图像加载器,把图像转化为字节序列。写自己的图像加载器虽然不难,但仍然挺麻烦的,而且如果要支持更多文件格式呢?你就不得不为每种你希望支持的格式写加载器了。

另一个解决方案也许是一种更好的选择,使用一个支持多种流行格式的图像加载库来为我们解决这个问题。比如说我们要用的stb_image.h库。

stb_image.h是Sean Barrett的一个非常流行的单头文件图像加载库,它能够加载大部分流行的文件格式,并且能够很简单得整合到你的工程之中。stb_image.h可以在这里下载。下载这一个头文件,将它以stb_image.h的名字加入你的工程,并另创建一个新的C++文件,输入以下代码:

#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"

通过定义STB_IMAGE_IMPLEMENTATION,预处理器会修改头文件,让其只包含相关的函数定义源码,等于是将这个头文件变为一个 .cpp 文件了。现在只需要在你的程序中包含stb_image.h并编译就可以了。

7、assimp
可以用源码编译也可以用apt-get 安装
源码下载:下载地址

mkdir build & cd build & cmake .. & make & make install

或者使用apt-get 方式

sudo apt-get install libassimp-dev

此时 /usr/include下和/usr/lib目录下可以看到头文件和依赖库

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Linux平台上使用SDL字体,需要安装相应的开发包。一般来说,可以使用以下命令安装: ``` sudo apt-get install libsdl2-dev libsdl2-ttf-dev libfreetype6-dev ``` 接下来,可以使用SDL_ttf库来加载和渲染TrueType字体。以下是一个简单的示例程序: ``` c #include <SDL2/SDL.h> #include <SDL2/SDL_ttf.h> #include <stdio.h> int main(int argc, char* argv[]) { SDL_Window* window = NULL; SDL_Renderer* renderer = NULL; TTF_Font* font = NULL; SDL_Surface* surface = NULL; SDL_Texture* texture = NULL; SDL_Rect rect; SDL_Init(SDL_INIT_VIDEO); TTF_Init(); window = SDL_CreateWindow("SDL Font Test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN); renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); font = TTF_OpenFont("arial.ttf", 24); if (!font) { printf("TTF_OpenFont error: %s\n", TTF_GetError()); return 1; } surface = TTF_RenderText_Solid(font, "Hello, world!", (SDL_Color){255, 255, 255, 255}); if (!surface) { printf("TTF_RenderText_Solid error: %s\n", TTF_GetError()); return 1; } texture = SDL_CreateTextureFromSurface(renderer, surface); rect.x = 0; rect.y = 0; rect.w = surface->w; rect.h = surface->h; SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); SDL_RenderClear(renderer); SDL_RenderCopy(renderer, texture, NULL, &amp;rect); SDL_RenderPresent(renderer); SDL_Delay(3000); SDL_DestroyTexture(texture); SDL_FreeSurface(surface); TTF_CloseFont(font); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); TTF_Quit(); SDL_Quit(); return 0; } ``` 在这个示例程序中,我们使用TTF_OpenFont函数加载Arial字体,并使用TTF_RenderText_Solid函数渲染“Hello, world!”文本。SDL_Color结构体用于指定字体颜色。最后,我们将渲染好的字体纹理复制到渲染器上,并调用SDL_RenderPresent函数显示结果。 在海思平台中,使用SDLSDL_ttf库需要进行交叉编译。具体步骤可以参考海思提供的开发文档。在渲染字体时,可以使用SDL_SetTextureColorMod函数设置纹理的颜色模式,例如: ``` c SDL_SetTextureColorMod(texture, 255, 0, 0); // 将纹理颜色设置为红色 ``` 这样可以实现字体颜色的设定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值