opengl回顾(一)

创建一个最简单的窗口所需要的步骤:

1、添加需要的头文件

#pragma once
#include <glad/glad.h>
#include <GLFW/glfw3.h>

2、选择自己的glfw版本号,并设定绘制模式

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//设定的是主版本号   3
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//设定的是次版本号   3
//综合起来就是选择glfw 3.3
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//现在设定的是绘制模式(profile)     选择的是核心模式(还有立即模式)
//glfwWindowHint(GLFW_FORWARD_COMPAT,GL_TRUE);//设置为mac os x系统下运作

3、创建窗口对象,并将窗口上下文设置成当前线程上下文(不要在意细节)

GLFWWindow *window = glfwCreateWindow(WIDTH, HEIGHT, NULL, NULL);
//宽 高

if(window == NULL)
{
    cout<<"Failed to create window"<<endl;
    glfwTerminate();
    return -1;
}
glfwMakeContextCurrent(window);//将窗口上下文设置成当前线程的上下文

4、创建窗口大小变化时的回调函数framebuffer_size_callback(即窗口变化时调用来调整视口的函数,不理解复制代码即可,先忽视具体意义),再使用glfwSetFramebufferSizeCallback注册这个回调函数。

void framebuffer_size_callback(GLFWwindow* window, int width, int height)
	{
		//保证视口匹配新窗口的尺寸,注意这里的宽高会显著大于视网膜显示屏上实际显示的宽高
		glViewport(0, 0, width, height);
		//前两个为左下角坐标,后两个为宽高
	}

glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
//窗口对象     函数

此处的窗口对象就是之前创建的窗口对象,它代表着你的窗口,而视口则代表着这个窗口中你需要渲染的部分,glViewPort前两个参数决定绘制的图像的左下角坐标点,后两个参数决定绘制的图像的宽高。也就是说你把参数改成

glviewPort(width/2, height/2, width, height)//修改前两个参数

那么图像就会从窗口的中心开始绘制(即绘制出来的图像的左下角会在窗口中心);若把后两个改成

glViewPort(0, 0, width/2, height/2);//修改后两个参数

那么绘制出来的图像就会从窗口左下角开始,覆盖窗口左下角四分之一的面积。

所以你每次改变窗口大小的时候也要改变视口大小,保证它们匹配,这样窗口中的图像才能铺满窗口。

5、初始化glad,即装载glfw函数指针

if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
    cout<<"Failed to initialize GLAD!"<<endl;
    return -1;
}

6、创建渲染循环,检测窗口是否需要关闭,绘制窗口

void processInput(GLFWwindow *window)
	{
		if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)//没按下会返回release
			glfwSetWindowShouldClose(window, true);//设置窗口应当关闭
	}
while(!glfwWindowShouldClose(window))          //检测窗口是否应当关闭
{
    processInput(window);                      //处理按键输入
    glClearColor(0.1, 0.2, 0.3);               //使用rgb颜色清窗(绘制)
    glClear(GL_COLOR_BUFFER_BIT);              //清除指定缓冲,这里是颜色缓冲

    glfwSwapBuffers(window);                   //为window交换缓冲
    glfwPollEvents(window);                    //为window处理事件(按键等)
}


glfwTerminate();                               //退出
return 0;

此处的glfwGetKey负责监听指定窗口的某个按键,按下后返回GLFW_PRESS,glfwWindowShouldClose负责检测并关闭窗口,它会在glfwSetWindowShouleClose设定了true时关闭窗口。glClearColor中的颜色为窗口中图像的实际颜色。

完整代码:

main.h

#pragma once
#include <glad/glad.h>
#include <GLFW/glfw3.h>

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>//数学库,先忽视

using namespace std;

namespace initialization {
	void framebuffer_size_callback(GLFWwindow* window, int width, int height);
	void processInput(GLFWwindow *window);

	// 宽高
	const unsigned int SCR_WIDTH = 1280;
	const unsigned int SCR_HEIGHT = 980;

	GLFWwindow* init(int SCR_WIDTH, int SCR_HEIGHT)
	{
		// glfw: initialize and configure
		// ------------------------------
		glfwInit();
		glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
		glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
        //GLFW版本号设定 主版本号3,次版本号3,即3.3

		glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
        //模式设定 使用核心模式
																	  
        //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//MAC OS X使用

#ifdef __APPLE__
		glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); //mac
#endif

        //创建窗口
		GLFWwindow* window = 
        glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "new begin", NULL, NULL);
		//宽 高 标题

		if (window == NULL)
		{
			std::cout << "Failed to create GLFW window" << std::endl;
			glfwTerminate();//终止
			return NULL;
		}

		glfwMakeContextCurrent(window);
        //将窗口上下文设置成当前线程的主上下文
		glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
        //注册窗口大小改变时的回调函数

        // 装载全部的opengl函数指针(初始化glad)
		// ---------------------------------------
		if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
		{
			std::cout << "Failed to initialize GLAD" << std::endl;
			return NULL;
		}

		return window;
	}

	//输入回调函数,处理窗口的按键输入等
	// ---------------------------------------------------------------------------------------------------------
	void processInput(GLFWwindow *window)
	{
		if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)//没按下会返回release
			glfwSetWindowShouldClose(window, true);//关闭窗口
	}

	// 窗口大小变换时调用的函数,用来调整视口大小
	// ---------------------------------------------------------------------------------------------
	void framebuffer_size_callback(GLFWwindow* window, int width, int height)
	{
		//保证视口匹配新窗口的尺寸,注意这里的宽高会显著大于视网膜显示屏上实际显示的宽高
		glViewport(0, 0, width, height);
		//前两个为左下角坐标,后两个为宽高
	}


}

main.cpp

#include"main.h"

int main()
{
	using namespace initialization;
	GLFWwindow *window = init(SCR_WIDTH,SCR_HEIGHT);

	// render loop
	// -----------
	while (!glfwWindowShouldClose(window))
	{
		// render
		// ------
		glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT);//清除指定BUFFER


		// input
		// -----
		processInput(window);



		// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
		// -------------------------------------------------------------------------------
		glfwSwapBuffers(window);//交换缓冲
		glfwPollEvents();//处理事件响应
	}

	// glfw: terminate, clearing all previously allocated GLFW resources.
	// ------------------------------------------------------------------
	glfwTerminate();
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_37051430/article/details/84034697