欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenGL学习之路之窗口的建立

程序员文章站 2022-07-04 18:48:56
...

环境配置

先建立一个空项目,建立一个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);
	}
}

相关标签: OpenGL opengl