opengl笔记

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

2016.9.25开启opengl之旅缓冲区:1.以字符“gl”作为前缀,然后是一个或者多个大写字母开头的词组,以此来命名一个完整的函数。2.以“glut”开头的函数,它们来自第三方库OpenGLUtilityToolkit(GLUT)。3.与函数命名约定类似,OpenGL库中定义的常量也是GL_COLOR_BUFFER_BIT的形式。4.所有的常量都以GL_作为前缀,并且使用下划线来分隔单词。(常量的定义是通过#define来完成的)5.glutDisplayFunc(),它设置了显示回调(displaycallback),即GLUT在每次更新窗口内容的时候会自动调用的例程6.函数中调用的最后一个函数是glutMainLoop(),这是一个无限执行的循环,它会负责一直处理窗口和操作系统的用户输入等操作(特别要注意:的是,glutMainLoop()是一个无限循环,因此不会执行在它之后的所有命令。)函数介绍:数组1.voidglGenVertexArrays(GLsizein,GLuint*arrays);返回n个未使用的对象名到数组arrays中,用作顶点数组对象。返回的名字可以用来分配更多的缓存对象,并且它们已经使用未初始化的顶点数组集合的默认状态进行了数值的初始化。2.voidglBindVertexArray(GLuintarray);glBindVertexArray()完成了三项工作。如果输入的变量array非0,并且是glGenVertexArrays()所返回的,那么它将创建一个新的顶点数组对象并且与其名称关联起来。如果绑定到一个已经创建的顶点数组对象中,那么会激活这个顶点数组对象,并且直接影响对象中所保存的顶点数组状态。如果输入的变量array为0,那么OpenGL将不再使用程序所分配的任何顶点数组对象,并且将渲染状态重设为顶点数组的默认状态。3.voidglDeleteVertexArrays(GLsizein,GLuint*arrays);删除n个在arrays中定义的顶点数组对象,这样所有的名称可以再次用作顶点数组。如果绑定的顶点数组已经被删除,那么当前绑定的顶点数组对象被重设为0(类似执行了glBindBuffer()函数,并且输入参数为0),而默认的顶点数组会变成当前对象。在arrays当中未使用的名称都会被释放,但是当前顶点数组的状态不会发生任何变化。4.GLbooleanglIsVertexArray(GLuintarray);如果array是一个已经用glGenVertexArrays()创建且没有被删除的顶点数组对象的名称,那么返回GL_TRUE。如果array为0或者不是任何顶点数组对象的名称,那么返回GL_FALSE。5.voidglBindBuffer(GLenumtarget,GLuintbuffer);glBindBuffer()完成了三项工作:1)如果是第一次绑定buffer,且它是一个非零的无符号整型,那么将创建一个与该名称相对应的新缓存对象。2)如果绑定到一个已经创建的缓存对象,那么它将成为当前被激活的缓存对象。3)如果绑定的buffer值为0,那么OpenGL将不再对当前target应用任何缓存对象。6.voidglDeleteBuffers(GLsizein,constGLuint*buffers);删除n个保存在buffers数组中的缓存对象。被释放的缓存对象可以重用(例如,使用glGenBuffers())。7.voidglBufferData(GLenumtarget,GLsizeiptrsize,constGLvoid*data,GLenumusage);size表示存储数据的总数量。这个数值等于data中存储的元素的总数乘以单位元素存储空间的结果。data要么是一个客户端内存的指针,以便初始化缓存对象,要么是NULL。如果传入的指针合法,那么将会有size大小的数据从客户端拷贝到服务端。如果传入NULL,那么将保留size大小的未初始化的数据,以备后用。usage用于设置分配数据之后的读取和写入方式功能介绍1着色器1.1传递着色器:它只负责将输入数据拷贝到输出数据中例1.2triangles.cpp对应的顶点着色器:triangles.vertExample1.2VertexShaderfortriangles.cpp:triangles.vert#version430core//指定了我们所用的OpenGL着色语言的版本layout(location=0)invec4vPosition;voidmain(){gl_Position=vPosition;}“core”表示我们将使用OpenGL核心模式(coreprofile),这与之前GLUT的函数glutInitContextProfile()设置的内容应当一致。*/每个着色器的第一行都应该设置“#version”,否则系统会假设使用“110”版本,但是这与OpenGL核心模式并不兼容。2.片元着色器:配合顶点着色器的工作例1.3triangles.cpp对应的片元着色器:triangles.fragExample1.3FragmentShaderfortriangles.cpp:triangles.frag#version430coreoutvec4fColor;voidmain(){fColor=vec4(0.0,0.0,1.0,1.0);}1.1声明的变量名为fColor.它使用了out限定符。着色器将会把fColor对应的数值输出,1.2设定片元的颜色,每个片元设置一个四维的向量。分别是(R,G,B,alpha)(alpha专用于度量透明度),2.OpenGL进行渲染voiddisplay(void){glClear(GL_COLOR_BUFFER_BIT);glBindVertexArray(VAOs[Triangles]);glDrawArrays(GL_TRIANGLES,0,NumVertices);glFlush();}2.1voidglClear(GLbitfieldmask);清除指定的缓存数据并重设为当前的清除值。mask是一个可以通过逻辑“或”操作(一般为:glClear(GL_COLOR_BUFFER_BIT);)glClearColor(1,1,1,1)四维参数为rgbalpha2.2使用OpenGL进行绘制:首先调用glBindVertexArray()来选择作为顶点数据使用的顶点数组,其次使用glDrawArrays()来实现顶点数据向OpenGL管线的传输。voidglDrawArrays(GLenummode,GLintfirst,GLsizeicount);使用当前绑定的顶点数组元素来建立一系列的几何图元,起始位置为first,而结束位置为first+count-1。mode设置了构建图元的类型,它可以是GL_POINTS、GL_LINES、GL_LINE_STRIP、GL_LINE_LOOP、GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN和GL_PATCHES中的任意一种。2.3glEnable()会开启一个模式,glDisable()会关闭它第二章着色器基础2.1OpenGL的可编程管线2.1.1顶点着色阶段(vertexshadingstage)将接收你在顶点缓存对象中给出的顶点数据,独立处理每个顶点。2.1.2细分着色阶段(tessellationshadingstage)是一个可选的阶段,与应用程序中显式地指定几何图元的方法不同,它会在OpenGL管线内部生成新的几何体.2.1.3几何着色阶段(geometryshadingstage)也是一个可选的阶段,它会在OpenGL管线内部对所有几何图元进行修改。2.1.4片元着色阶段(Fragmentshadingstage)这个阶段会处理OpenGL光栅化之后生成的独立片元(如果启用了采样着色的模式,就是采样数据),并且这个阶段也必须绑定一个着色器。2.1.5计算着色阶段(Computeshadingstage)和上述阶段不同,它并不是图形管线的一部分,而是在程序中相对独立的一个阶段例2.1一个简单的顶点着色器Example2.1ASimpleVertexShader#version330coreinvec4vPosition;invec4vColor;outvec4color;uniformmat4ModelViewProjectionMatrix;voidmain(){color=vColor;gl_Position=ModelViewProjectionMatrix*vPosition;}2.2使用GLSL构建着色器#version330corevoidmain(){//Yourcodegoeshe}在这里编写代码变量的声明:GLSL是一种强类型语言,所有变量都必须事先声明,并且要给出变量的类型变量名称的命名规范与C语言相同:可以使用字母、数字,以及下划线字符(_)来组成变量的名字。变量的作用域同C++变量的初始化所有变量都必须在声明的同时初始化,例如:inti,numParticles=1500;整型变量可以表示八进制,十进制,十六进制,可以加符号表示负数,也可以在前面加上U表示无符号。浮点变量可以在数后面加f布尔变量可以是trueorfalse对他进行初始化。构造函数intf=false;这样的写法会编译出错,因为布尔值不能赋予整型变量。所有其他的数值转换都需要提供显式的转换构造函数。floatf=10.0;intten=int(f);这里用到了一个int转换构造函数来完成转换。此外,还有其他类型也有转换构造函数,包括float、double、uint、bool,以及这些类型的向量和矩阵。每种构造函数都可以传入多个其他类型的值并且进行显式转换。这体现了GLSL的一个特性就是函数的重载。结构体结构体可以简化多组数据传入函数的过程。如果定义了一个结构体,那么他会自动创建一个新类型,并隐式定义一个构造函数,将各种元素的结构体元素作为输入参数。数组:数组可以定义大小也可以不定义大小。数组的声明需要中括号。如果我们要静态初始化一个数组的值可以按照下面的形式使用构造函数这里的构造函数的维数值可以不填。此外,GLSL的数组与Java类似,它有一个隐式的方法可以返回元素的个数:向量和矩阵都可以用length()方法,向量的长度就是它分量的个数,矩阵的长度就是它包含列的个数。因为长度在编译时已知,所以可以返回一个常量,例如:mat4m;floatdiagonal[m.length()];//设置数组的大小与矩阵大小相等floatx[gl_in.length()];//设置数组的大小与几何着色器的输入顶点数相等多维数组相当于从数组中再创建数组,它的语法与C语言当中类似:floatcoeff[3][5];//一个大小为3的数组,其中包含了大小为5的多个数组coeff[2][1]*=2.0;//内层索引设置为1,外层设置为2coeff.length();//这个方法会返回常量3coeff[2];//这是一个大小为5的1维数组coeff[2].length();//这个方法会返回常量5存储限制符:数据类型也可以通过一些修饰符来改变自己的行为。如表2-5所示。表2-5GLSL的类型修饰符类型修饰符描述const将一个变量定义为只读形式。如果它初始化时用的是一个编译时常量,那么它本身也会成为编译时常量in设置这个变量为着色器阶段的输入变量out设置这个变量为着色器阶段的输出变量uniform设置这个变量为用户应用程序传递给着色器的数据,它对于给定的图元而言是一个常量buffer设置应用程序共享的一块可读写的内存。这块内存也作为着色器中的存储缓存(storagebuffer)使用shared设置变量是本地工作组(localworkgroup)中共享的。它只能用于计算着色器中

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功