OpenGL编程指南(第9版)---- 笔记(第1章)

2020-03-06  本文已影响0人  wolfaherd

OpenGL概述

什么是OpenGL

 OpenGL是一种应用程序编程接口(Application Programming Interface,API),它是一种可以对图形硬件设备特性进行访问的软件库。
能够做什么
 ①可以用于设置所需的对象、图像和操作,以便开发交互式的三维计算机图形应用程序。
 ②通过一系列的几何图元(geometric primitive)(包括点、线、三角形以及面片)来创建三维空间的物体。
不能够做什么
 ①OpenGL没有提供任何用于表达三维物体模型,或者读取图像文件(例如JPEG文件)的操作。
工作方式
 ①从OpenGL的几何图元中设置数据,用于构建形状。
 ②使用不同的着色器(shader)对输入的图元数据执行计算操作,判断它们的位置、颜色,以及其他渲染属性。
 ③将输入图元的数学描述转换为与屏幕位置对应的像素片元(fragment)。这一步也称作光栅化(rasterization)。(OpenGL中的片元若最终渲染为图像,那它就是像素。)
 ④针对光栅化过程产生的每个片元,执行片元着色器(fragment shader),从而决定这个片元的最终颜色和位置。
 ⑤如果有必要,还需要对每个片元执行一些额外的操作,例如判断片元对应的对象是否可见,或者将片元的颜色与当前屏幕位置的颜色进行混合。

初识OpenGL程序

结构:
 ①初始化物体渲染所对应的状态。
 ②设置需要渲染的物体。
表现形式:
 ①程序的起始部分,包含必要的头文件并且声明一些全局变量和其他有用的编程结构
 ②init()函数负责设置程序中需要用到的数据。
 ③diplay()函数负责调用OpenGL函数并渲染需要的内容。
 ④main()函数执行创建窗口、调用init()以及最终进入事件循环体的一系列繁重工作。

OpenGL语法

OpenGL所使用命令的命名格式
 ①OpenGL库中所有的函数都会以字符“gl”作为前缀,然后是一个或者多个大写字母开头的词组,以此来命名一个完整的函数(例如glBindVertexArray())。
 ②OpenGL定义的常量都以GL_作为前缀,并且使用下划线来分割单词。

OpenGL渲染管线

image.png
image.png

第一个程序:深入分析

main()函数

int main(int argc,char** argv)
{
     glfwInit();//初始化GLFW库

     GLFWwindow* window = glfwCreateWindow(640,480,"Triangles",NULL,NULL);//设置了程序所使用的窗口类型以及期望的窗口尺寸;同时还创建了一个与窗口关联的OpenGL设备环境。
     
     glfwMakeContextCurrent(window);//设置window为当前环境
     gl3wInit();//初始化GL3W库
     
     init();//初始化OpenGL相关的所有数据

     while(!glfwWindowShouldClose(window))//判断是否需要关闭窗口
     {
           display();//清屏并绘制
           glfwSwapBuffers(window);//呈现给最终用户
           glfwPollEvents();//检查操作系统返回的任何信息
     }
     
     glfwDestroyWindow(window);//清理窗口
     glfwTerminate();//关闭GLFW库
}

init()函数

void
init( void )
{
   glGenVertexArrays( NumVAOs, VAOs );//4.5版本:glCreateVertexArrays  分配顶点数组对象
   glBindVertexArray( VAOs[Triangles] );//在OpenGL环境下创建并且绑定一个顶点数组对象

   GLfloat  vertices[NumVertices][2] = {
       { -0.90f, -0.90f }, {  0.85f, -0.90f }, { -0.90f,  0.85f },  // Triangle 1
       {  0.90f, -0.85f }, {  0.90f,  0.90f }, { -0.85f,  0.90f }   // Triangle 2
   };//初始化顶点数组对象 

   glCreateBuffers( NumBuffers, Buffers );//创建顶点缓存对象的名称
   glBindBuffer( GL_ARRAY_BUFFER, Buffers[ArrayBuffer] );//绑定缓存到OpenGL环境
   glBufferStorage( GL_ARRAY_BUFFER, sizeof(vertices), vertices, 0);//4.5版本:glNamedBufferStorage 分配顶点数据所需的存储空间,然后将数据从应用程序的数组中拷贝到OpenGL服务端的内存中。

   ShaderInfo  shaders[] =
   {
       { GL_VERTEX_SHADER, "media/shaders/triangles/triangles.vert" },
       { GL_FRAGMENT_SHADER, "media/shaders/triangles/triangles.frag" },
       { GL_NONE, NULL }
   };//创建ShaderInfo结构体数组

   GLuint program = LoadShaders( shaders );//读取文件初始化顶点与片元着色器,并创建OpenGL着色器程序
   glUseProgram( program );//指定OpenGL环境使用新创建的OpenGL着色器程序

   glVertexAttribPointer( vPosition, 2, GL_FLOAT,
                          GL_FALSE, 0, BUFFER_OFFSET(0) );//将vPosition关联到一个顶点属性数组
   glEnableVertexAttribArray( vPosition );//启用顶点属性数组
}

display()函数

void 
display(void)
{
     static const float black[] = { 0.0f, 0.0f, 0.0f, 0.0f };

     glClearBufferfv(GL_COLOR, 0, black);//清楚帧缓存的数据

     glBindVertexArray( VAOs[Triangles] );//选择作为顶点数据使用的顶点数组
     glDrawArrays( GL_TRIANGLES, 0, NumVertices );//实现顶点数据向OpenGL管线的传输
}
上一篇 下一篇

猜你喜欢

热点阅读