小白入门opengl(一)开始制作第一个窗口

在程序一开始写下如下代码

#include
#include

接下来就开始创建main函数 ,在此函数中我们会实例化GLFW窗口:

int main()
{
   glgwInit();//调用glfwInit函数来初始化GLFW
   glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);//分别代表主版本号与次版本号
   glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3);//这两句话代表着GLFW的版本号为3.3
   glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFLIE);
   /*明确告诉GLFW我们使用的是核心模式,意味着我们只能使用Opengl功能的一个子集*/

接下来就是创建一个窗口对象,存放着所有和窗口相关的数据,并且会被GLFW的其他函数频繁的用到。

GLFWwindow *window =glfwCreateWindow(800,600,"LearningOpenGL",NULL,NULL);
/*glfwCreateWindow函数的一二两个参数代表着窗口的长度和宽度,第三个参数表示这个窗口的名称,该函数会返回一个GLFWwindow的对象*/
if(window==NULL)
{
   cout<<"Failed to create GLFW window"<return -1;
}
glfwMakeContextCurrent(window);

GLAD是用来管理OpenGL的函数指针的。

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

Viewport
在开始渲染之前我们还要告诉OpenGL**渲染窗口**的尺寸大小,这样OpenGL才只能知道根据窗口大小显示数据和坐标。我们可以通过调用glViewport来设置窗口的维度。

glViewport(0,0,800,600);

glViewport函数前两个参数控制窗口左下角的位置,第三四个参数控制渲染窗口的宽度和高度。
当然,用户改变窗口大小的时候,视口也应该被调整。我们应该对窗口注册一个回调函数,在每次窗口大小改变的时候被调用,如下
void framebuffer_size_callback(GLFWwindow *window,int width,int height)
{
glViewport(0,0,width,height);
}
我们还要注册这个函数,告诉GLFW我们希望每当窗口调整大小的时候调用这个函数。
渲染循环
我们并不希望在绘制一个图像之后就立即的退出并且关闭窗口,我们希望在主动关闭它之前不断的绘制图像并且能接收用户输入,我们称之为渲染循环,下面几行简单的代码就实现了一个渲染循环。

while(!glfwWindowShouldClose(window))
{
  glfwSwapBuffers(window);
  glfwPollEvents();
}
> 双缓冲(Double Buffer)

应用程序使用单缓冲绘图时可能会存在图像闪烁的问题。 这是因为生成的图像不是一下子被绘制出来的,而是按照从左到右,由上而下逐像素地绘制而成的。最终图像不是在瞬间显示给用户,而是通过一步一步生成的,这会导致渲染的结果很不真实。为了规避这些问题,我们应用双缓冲渲染窗口应用程序。前缓冲保存着最终输出的图像,它会在屏幕上显示;而所有的的渲染指令都会在后缓冲上绘制。当所有的渲染指令执行完毕后,我们交换(Swap)前缓冲和后缓冲,这样图像就立即呈显出来,之前提到的不真实感就消除了。

最后渲染循环结束后我们需要正确释放/删除之前分配的所有资源,可以在main函数最后调用glfwTerminate函数来完成。

glfwTerminate();
return 0;

输入
我们同样也希望在GLFW中实现一些输入控制,这可以通过GLFW的几个输入函数来完成,比如glfwGetKey函数,需要一个窗口和一个按键作为输入,这个函数会返回此按键是否正在被按下,我们将创建一个processInput函数来让所有的输入代码保持整洁。

void processInput(GLFWwindow *window)
{
   if(glfwGetKey(window,GLFW_KEY_ESCAPE)==GLFW_PRESS)
    glfwSetwindowShouldClose(window,ture);
}

你可能感兴趣的:(opengl,learning)