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

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

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

接下来就开始创建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"<<endl;
   glfwTerminate();
   return -1;
}
glfwMakeContextCurrent(window);

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

if(!gladLoaderGLloader((GLADloadproc)glfwGetProcAddress))
{
   cout<<"Failed to initialize GLAD"<<endl;
   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);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用OpenGL初始化一个三维窗口的基本步骤: 1. 导入OpenGL库 在C++中,可以使用以下代码导入OpenGL库: ``` #include <GL/glut.h> ``` 2. 初始化窗口 可以使用以下代码初始化窗口: ``` glutInit(&argc, argv); // 初始化glut库 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); // 设置显示模式 glutInitWindowSize(width, height); // 设置窗口大小 glutInitWindowPosition(x, y); // 设置窗口位置 glutCreateWindow("Title"); // 创建窗口并设置标题 ``` 其中,`width`和`height`分别代表窗口的宽度和高度,`x`和`y`分别代表窗口的左上角在屏幕上的位置。 3. 设置视角 可以使用以下代码设置视角: ``` glMatrixMode(GL_PROJECTION); // 设置矩阵模式为投影矩阵 glLoadIdentity(); // 重置矩阵 gluPerspective(fovy, aspect, zNear, zFar); // 设置透视投影矩阵 ``` 其中,`fovy`代表视角的大小,`aspect`代表窗口的宽高比,`zNear`和`zFar`分别代表近裁剪面和远裁剪面的位置。 4. 设置模型视角 可以使用以下代码设置模型视角: ``` glMatrixMode(GL_MODELVIEW); // 设置矩阵模式为模型视角矩阵 glLoadIdentity(); // 重置矩阵 gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ); // 设置视点和观察点 ``` 其中,`(eyeX, eyeY, eyeZ)`代表视点的位置,`(centerX, centerY, centerZ)`代表观察点的位置,`(upX, upY, upZ)`代表相机的上向量。 5. 设置光照 可以使用以下代码设置光照: ``` GLfloat light_position[] = {x, y, z, w}; // 光源位置 glLightfv(GL_LIGHT0, GL_POSITION, light_position); // 设置光源位置 glEnable(GL_LIGHTING); // 启用光照 glEnable(GL_LIGHT0); // 启用光源 ``` 其中,`light_position`数组代表光源的位置,`GL_LIGHT0`代表光源的编号。 6. 渲染场景 可以使用以下代码渲染场景: ``` glClearColor(r, g, b, a); // 设置背景色 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清空颜色缓冲区和深度缓冲区 // 绘制场景 glutSwapBuffers(); // 双缓冲交换缓冲区 ``` 其中,`(r, g, b, a)`代表背景色的RGBA值。 7. 进入事件循环 可以使用以下代码进入事件循环: ``` glutMainLoop(); ``` 这样就完成了一个基本的OpenGL三维窗口的初始化。当然,具体的场景渲染和交互事件处理需要根据具体的需求进行实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值