天天看点

OpenGL学习之路之窗口的建立环境配置创建自己的引擎代码如下

环境配置

先建立一个空项目,建立一个c++文件,然后设置解决方案的属性设置三个位置

第一是c/c++\常规\附加包含目录加入include的文件夹,glfw和glew都需要,第二,链接器\常规\附加库目录,lib文件夹,第三,链接器\输入\附加依赖库,opengl32.lib glfw3.lib glew32s.lib

创建自己的引擎

将文件修改为main作为主函数

#define GLEW_STATIC
           

这个注意小心拼写错误,本人搞了几小时

初始化

声明版本号

glfwInit();
	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);
           

MacOSX系统加上这一句

以上是初始化Glfw,说明我们要使用的OPENGL版本是3.3,我们同样明确告诉GLFW我们使用的是核心模式(Core-profile)。明确告诉GLFW我们需要使用核心模式意味着我们只能使用OpenGL功能的一个子集。

创建窗口指针

GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOPENGL", NULL, NULL);//前两个参数代表生成窗口大小
           

接下来进行GLFW的初始化

if (window == NULL)
	{
		std::cout << "GLFW窗口初始化失败" << std::endl;
		glfwTerminate();//程序终止函数
		return -1;
	}
glfwMakeContextCurrent(window);
           

然后是GLEW的初始化

glewExperimental = GL_TRUE;
	if (glewInit() != GLEW_OK)
	{
		std::cout << "GLEW初始化失败" << std::endl;
		return -1;
	}
           

确定渲染窗口

glViewport(0, 0, 800, 600);//渲染窗口大小
glfwSetFramebufferSizeCallback(window,framebuffer_size_callback);//注册函数
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
	glViewport(0, 0, width, height);
}
           

framebuffer_size_callback自定义函数注册到当窗口大小改变的事件中能及时反映

确定基本架构

while(!glfwWindowShouldClose(window)){
		//输入
		//渲染指令
		//检查并调用事件,交换缓冲
		glfwSwapBuffers(window);//进行屏幕缓冲
		glfwPollEvents();//检查函数有没有触发事件	
}
           

清理缓冲区颜色

glClearColor(0.2f, 0.3f, 0.3f, 1.0f);//来设置清空屏幕所用的颜色,表示清除板的颜色
		glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓冲之后
           

输入

processInput(window)
void processInput(GLFWwindow* window) {
	//输入
	if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
		glfwSetWindowShouldClose(window, GLFW_TRUE);
	}
}
           

代码如下

#define GLEW_STATIC
#include<GL/glew.h>
#include<GLFW/glfw3.h>
#include<iostream>
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow* window);
int main()
{
	glfwInit();
	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);MacOSX系统加上这一句
	//以上是初始化Glfw,说明我们要使用的OPENGL版本是3.3,我们同样明确告诉GLFW我们使用的是核心模式(Core-profile)。明确告诉GLFW我们需要使用核心模式意味着我们只能使用OpenGL功能的一个子集。

	GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOPENGL", NULL, NULL);//前两个参数代表生成窗口大小
	if (window == NULL)
	{
		std::cout << "GLFW窗口初始化失败" << std::endl;
		glfwTerminate();//程序终止函数
		return -1;
	}
	glfwMakeContextCurrent(window);
	//GLFW初始化
	glewExperimental = GL_TRUE;
	if (glewInit() != GLEW_OK)
	{
		std::cout << "GLEW初始化失败" << std::endl;
		return -1;
	}
	//Glew的初始化
	glViewport(0, 0, 800, 600);//渲染窗口大小
	glfwSetFramebufferSizeCallback(window,framebuffer_size_callback);//注册函数
	while(!glfwWindowShouldClose(window))
	{
		//输入
		processInput(window);

		//渲染指令
		glClearColor(0.2f, 0.3f, 0.3f, 1.0f);//来设置清空屏幕所用的颜色,表示清除板的颜色
		glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓冲之后


		//检查并调用事件,交换缓冲
		glfwSwapBuffers(window);//进行屏幕缓冲
		glfwPollEvents();//检查函数有没有触发事件
		
	}
	glfwTerminate();

	return 0;
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
	glViewport(0, 0, width, height);
}
void processInput(GLFWwindow* window) {
	//输入
	if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
		glfwSetWindowShouldClose(window, GLFW_TRUE);
	}
}

           

继续阅读