IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> 使用premake5配置SOIL2开发环境 -> 正文阅读

[开发工具]使用premake5配置SOIL2开发环境

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

使用《计算机图形学编程(使用OpenGL和C++)》这本书时,其中GLFW、GLEW等相关库的配置着实令人头疼不已,特别是配置SOIL2的过程,花了不少时间。现在使用premake来配置SOIL2

一、premake是什么?

Premake 是一种命令工具,通过读取项目脚本,来生成各种开发环境的项目文件。主要用于:

生成开发人员喜欢的平台,工具集(协同开发的人员,可以使用不同的平台和开发工具)
通过脚本保持不同平台,工具集下的项目配置同步(比如新建文件夹,引入新的库文件)
通过脚本来快速更新许多不同的大型代码库,并重新生成项目(比如对依赖的多种著名库的版本更新)
快速升级工具集的版本(比如无缝地从VisualStudio 2010升级到VisualStudio 2019)
目前支持:

Microsoft Visual Studio 2005-2019
GNU Make,包括 Cygwin 和 MinGW
XCode
Codelite
Premake 5.0 目前支持:

32 和 64 位平台
Xbox 360(仅支持Visual Studio)
插件模块可以支持其他语言,框架,和工具集
Premake 是存粹的旧版C应用程序,发布为一个单个的,非常小的exe文件。支持完整的Lua脚本环境
开源地址:https://github.com/premake/premake-core
下载地址:https://premake.github.io/
实例地址:https://github.com/wuguyannian/tutorial_premake
在这里插入图片描述

二、下载SOIL2

SOIL2源码下载地址

1.引入库

下载完SOIL2和premake后,将它们两个解压,然后把premake解压得到的premake5.exe放在SOIL2的文件夹里

在这里插入图片描述

使用premake5配置SOIL2

在下图圈起来的地址栏位置,输入cmd,进入命令界面
然后在命令行界面输入,.\premake5.exe vs2019 注意前面有个 点和右斜杠
否则报错!!!!
PS:因为我是在vs2019上进行编写,如果读者用的是vs2017,应该输入.\premake5.exe vs2017
在这里插入图片描述
Success!
此时SOIL2的文件夹多出个新文件夹make,make下有个文件夹windows,windows文件夹里面又有一个SOIL2.sln文件,打开它
在这里插入图片描述
进入解决方案资源管理器,对soil2-static-lib右键,点击生成
在这里插入图片描述
这里生成32位和64位的lib都可以
在这里插入图片描述
分别生成debug和release版本的lib和dll库
release版本:
soil2.lib
soil2.dll

debug版本
soil2-debug.lib
soil2-debug.dll
在这里插入图片描述

使用SOIL2创建工程

  1. vs2019创建空工程
  2. 把SOIL2头文件,soil2-debug.lib、soil2-debug.dll文件拷贝到工程文件中,目录结构如下
    SOIL2头文件在这里插入图片描述
    SOIL2静态库
    soil2-debug.lib 是debug版本
    soil2.lib 是release版本
    在这里插入图片描述
    SOIL2动态库
    在这里插入图片描述

3.配置SOIL2.lib
在这里插入图片描述
4.代码

#include "glew/glew.h"
#include "glfw/glfw3.h"
#include "Utils.h"
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

#pragma comment(lib, "soil2-debug.lib")

static const int Screen_Width = 800;
static const int Screen_Height = 600;

static const GLuint numVAOs = 1;
GLuint vao[numVAOs];
GLuint renderintprogram = 0;

void printShaderLog(GLuint shaderId)
{
	int nLen = 0;
	int nWrittn = 0;
	char* chLogMsg = nullptr;
	//用来检测着色器编译是否成功
	glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &nLen);
	if (nLen > 0)
	{
		chLogMsg = (char*)malloc(nLen);
		if (!chLogMsg)
		{
			cout << "Allocate memory failed. Invoke malloc()." << "Error file:" << __FILE__ << "...Error line:" << __LINE__ << std::endl;
			return;
		}
		/* 功能:         获取着色器程序编译错误信息,glGetShaderiv()一个 shader 对象的日志信息可能包含诊断信息,警告信息,和其他关于编译操作的信息
		* vShader:        用来存放着色器对象
		* nLen:          指定储存日志信息的字符缓存大小
		* &nWrittn:      返回 chLog(不包括空结尾符)的字符串实际长度
		* chLog           指定用于返回日志信息的字符数组
		*/
		glGetShaderInfoLog(shaderId, nLen, &nWrittn, chLogMsg);
		cout << "Shader error infomation:" << chLogMsg << std::endl;
		free(chLogMsg);
	}
}

void printProgramInfo(GLuint programId)
{
	int nLen = 0;
	int nWrittn = 0;
	char* chLogMsg = nullptr;
	glGetProgramiv(programId, GL_INFO_LOG_LENGTH, &nLen);
	if (nLen > 0)
	{
		chLogMsg = new char[nLen];
		if (!chLogMsg)
		{
			cout << "Allocate memory failed. Invoke new operator." << "Error file:" << __FILE__ << "...Error line:" << __LINE__ << std::endl;
			return;
		}
		glGetProgramInfoLog(programId, nLen, &nWrittn, chLogMsg);
		cout << "Program error log:" << chLogMsg << "Error file:" << __FILE__ << ".....Error line:" << __LINE__ << std::endl;
		delete chLogMsg;
	}
}

bool checkOpenglError()
{
	bool foundError = false;
	int nErrorCode = glGetError();
	while (GL_NO_ERROR != nErrorCode)
	{
		cout << "OpenGL error, error number=" << nErrorCode << "error file:" << __FILE__ << ".......Error line:" << __LINE__ << std::endl;
		foundError = true;
		nErrorCode = glGetError();
	}

	return foundError;
}

void init(GLFWwindow* window)
{
	renderintprogram = Utils::createShaderProgram("vertShader.glsl", "fragShader.glsl");
	glGenVertexArrays(numVAOs, vao);
	glBindVertexArray(vao[0]);
}

void display(GLFWwindow* window, double currentTiem)
{
	glClearColor(1.f, 0.f, 1.f, 1.f);
	glClear(GL_COLOR_BUFFER_BIT);
	glUseProgram(renderintprogram);
	glDrawArrays(GL_TRIANGLES, 0, 3);
	/*glfwSwapBuffers(window);
	glfwPollEvents();*/
}

int main(int argc, char** argv)
{
	int glfwStatus = glfwInit();
	if (GLFW_FALSE == glfwStatus)
	{
		cout << "GLFW initialize failed!, Invoke glfwInit()." << "Error file:" << __FILE__ << ".....Error line:" << __LINE__ << std::endl;
		glfwTerminate();
		exit(EXIT_FAILURE);
	}
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
	glfwWindowHint(GLFW_OPENGL_CORE_PROFILE, GLFW_OPENGL_PROFILE);

	GLFWwindow* window = glfwCreateWindow(Screen_Width, Screen_Height, "Draw trangle opengl", nullptr, nullptr);
	if (nullptr == window)
	{
		cout << "GLFW create window failed, Invoke glfwCreateWindow()." << "Error file:" << __FILE__ << "Error line:" << __LINE__ << std::endl;
		glfwTerminate();
		exit(EXIT_FAILURE);
	}
	glfwMakeContextCurrent(window);

	int glewStatue = glewInit();
	if (GLEW_OK != glewStatue)
	{
		cout << "GLEW initialize failed, Invoke glewInit(). Error file:" << __FILE__ << "Error line:" << __LINE__ << std::endl;
		exit(EXIT_FAILURE);
	}

	//由于这些原因,应用程序通常希望将交换间隔设置为1。可以将其设置为更高的值,但通常不建议这样做,因为这样会导致输入延迟。
	glfwSwapInterval(1);

	init(window);

	while (!glfwWindowShouldClose(window))
	{
		display(window, glfwGetTime());
		//在display中已经加入了交换缓冲区,否则重复加glfwSwapBuffer有闪烁
		glfwSwapBuffers(window);
		glfwPollEvents();
	}

	glfwDestroyWindow(window);
	glfwTerminate();
	exit(EXIT_FAILURE);

	return 0;
}

程序运行
在这里插入图片描述

三、工程下载

 [工程源码下载](https://download.csdn.net/download/aoxuestudy/64632489)
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-12-18 16:11:43  更:2021-12-18 16:12:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 14:48:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码