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管线的传输 }
网友评论