OpenGL中所有函数都以字符gl作为前缀,还有些以glfw、gl3w或glew为前缀的函数,来自于第三方库GLFW、GL3W、GLEW
由于OpenGL是C语言的库,没有重载,所以OpenGL中区分同名函数使用后缀的变化来标记,例如glUniform2f()和glUniform3fv(),2f中的2表示两个参数,f表示参数类型为GLfloat类型,即glUniform2f()需要传入两个GLfloat类型的参数,而glUniform3fv()中v表示vector(向量)类型,即这个函数我们需要使用一个3维向量作为参数传入,这个三维向量的每个分量都是GLfloat类型,注意,在OpenGL中,向量vector类型是使用一维数组来表示,所以glUniform3fv()的参数为一个含有3个GLfloat值的一维数组
后缀与参数类型对应关系
b 8位整数 char
s 16位整数 short
i 32位整数 int
f 32位浮点 float
d 64位浮点 double
ub 8位无符号整型
us 16位无符号整型
ui 323位无符号整型
Uniform:属性是一种对整个批次属性都取统一值的单一值。它是不变的。通过设置uniform变量就紧接着发送一个图元批次命令,Uniform变量实际上可以无数次限制地使用,设置一个应用于整个表面的单个颜色值,还可以设置一个时间值。在每次渲染某种类型的顶点动画时修改它。、
glEnable(GL_LINE_STIPPLE);//打开虚线模式glDisable(GL_LINE_STIPPLE)可关闭
glLineStipple(2, 0x0F0F);//void glLineStipple(GLint factor, GLushort pattern); pattern为虚线样式序列(16位二进制数)
glClear度
glBegin(GL_LINES);
点
线
glLineWidth(10.0f);//线宽
glEnable(GL_LINE_STIPPLE);
glDisable(GL_LINE_STIPPLE);
面
正面反面
GL_FRONT
GL_BACK
面的处理方式则有填充和轮廓
glPolygonMode
GL_LINE
GL_FILL
glEnable(GL_POLYGON_STIPPLE);//打开镂空模式
glDeleteTextures - 删除纹理
glPushMatrix
glTranslatef
glScalef
glRotatef
glDisable
glEnable
glBlendFunc
glEnableClientState
glBindTexture
glTexParameterf
https://blog.csdn.net/flycatdeng/article/details/82588903
glActiveTexture - 激活纹理单元
glAttachShader- 将着色器对象附加到program对象
glBindAttribLocation - 将通用顶点属性索引与命名属性变量相关联
glBindAttribLocation - 将通用顶点属性索引与命名属性变量相关联
glEnable( GL_BLEND ); // 启用混合
glBlendFunc( GLenum sfactor , GLenum dfactor ); // 混合函数
sfactor 源混合因子
dfactor 目标混合因子
OpenGL——纹理过滤函数glTexParameteri()
图象从纹理图象空间映射到帧缓冲图象空间(映射需要重新构造纹理图像,这样就会造成应用到多边形上的图像失真),这时就可用glTexParmeteri()函数来确定如何把纹理象素映射成像素.
GL_TEXTURE_2D: 操作2D纹理.
GL_TEXTURE_WRAP_S: S方向上的贴图模式.
GL_CLAMP: 将纹理坐标限制在0.0,1.0的范围之内.如果超出了会如何呢.不会错误,只是会边缘拉伸填充.
GL_LINEAR: 线性过滤, 使用距离当前渲染像素中心最近的4个纹素加权平均值.
GL_REPEAT
openggl 图片优化
如果纹理很大,并且您每次分配新内存来存储越来越多的副本,那么很快就会用完的记忆。解决方案是在应用程序初始化期间调用 glTexImage2D 一次,并且仅在要使用它时才调用 glBindTexture 。如果要在单击时更改纹理本身,请仅调用 glBindTexture 和 glTexImage2D 。如果新图像的大小与先前图像的大小相同,则可以调用 glTexSubImage2D 告诉OpenGL覆盖旧图像数据,而不是删除并上传新图像数据。 / p>
函数说明
/*
* glGenRenderbuffers 的原型为:
* void glGenRenderbuffers (GLsizei n, GLuint* renderbuffers)
* 它是为 renderbuffer 申请一个 id(或曰名字)。
* 参数 n 表示申请生成 renderbuffer 的个数,
* 而 renderbuffers 返回分配给 renderbuffer 的 id,
* 注意:返回的 id 不会为0,id 0 是OpenGL ES 保留的,我们也不能使用 id 为0的 renderbuffer。
*/
glGenRenderbuffers(1, &self->_colorRenderBuffer);
/*
* glBindRenderbuffer 的原型为:
* void glBindRenderbuffer (GLenum target, GLuint renderbuffer)
* 这个函数将指定 id 的 renderbuffer 设置为当前 renderbuffer。
* 参数 target 必须为 GL_RENDERBUFFER,参数 renderbuffer 是就是使用 glGenRenderbuffers 生成的 id。
* 当指定 id 的 renderbuffer 第一次被设置为当前 renderbuffer 时,会初始化该 renderbuffer 对象,其初始值为:
* width 和 height:像素单位的宽和高,默认值为0;
* internal format:内部格式,三大 buffer 格式之一 -- color,depth or stencil;
* Color bit-depth:仅当内部格式为 color 时,设置颜色的 bit-depth,默认值为0;
* Depth bit-depth:仅当内部格式为 depth时,默认值为0;
* Stencil bit-depth: 仅当内部格式为 stencil,默认值为0;
*/
glBindRenderbuffer(GL_RENDERBUFFER, self.colorRenderBuffer);
/*
* glFramebufferRenderbuffer的函数原型为:
* void glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
* 该函数是将相关 buffer(三大buffer之一)attach到framebuffer上(如果 renderbuffer不为 0,
* 知道前面为什么说glGenRenderbuffers 返回的id 不会为 0 吧)或从 framebuffer上detach
* (如果 renderbuffer为 0)。参数 attachment 是指定 renderbuffer 被装配到那个装配点上,zm
* 其值是GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT中的一个,
* 分别对应 color,depth和 stencil三大buffer。
*/
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, self.colorRenderBuffer);
/*
* glDrawElements 函数的原型为:
* void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
* 第一个参数 mode 为描绘图元的模式,其有效值为:GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN。这些模式具体含义下面有介绍。
* 第二个参数 count 为顶点索引的个数也就是,type 是指顶点索引的数据类型,因为索引始终是正值,索引这里必须是无符号型的非浮点类型,
* 因此只能是 GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT 之一,为了减少内存的消耗,尽量使用最小规格的类型如 GL_UNSIGNED_BYTE。
* 第三个参数 indices 是存放顶点索引的数组。(indices 是 index 的复数形式,3D 里面很多单词的复数都挺特别的。)
*/
glDrawElements(GL_LINES, sizeof(indices)/sizeof(GLubyte), GL_UNSIGNED_BYTE, indices);
/*
* glClearColor用来设置清屏颜色,默认为黑色
*/
glClearColor(0, 1.0, 0, 1.0);
/*
* glClear(GLbitfieldmask)用来指定要用清屏颜色来清除由mask指定的buffer
* mask 可以是 GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT的自由组合。
*/
glClear(GL_COLOR_BUFFER_BIT);
/*
* 设置 viewport
* glViewport 表示渲染 surface 将在屏幕上的哪个区域呈现出来,
*/
glViewport(0, 0, self.frame.size.width, self.frame.size.height);
glPushMatrix、glPopMatrix
操作事实上就相当于栈里的入栈和出栈。
https://blog.csdn.net/u010579736/article/details/51884989
比如你当前的坐标系原点在你电脑屏幕的左上方。如今你调用glPushMatrix,然后再调用一堆平移、旋转代码等等,然后再绘图。那些平移和旋转都是基于左上角为原点进行变化的。并且都会改变坐标的位置,经过了这些变化后,你的坐标肯定不再左上角了。
那假设想恢复怎么办呢?这时就调用glPopMatrix从栈里取出一个“状态”了,这个状态就是你调用glPushMatrix之前的那个状态。就如非常多opengl的书上所讲:调用glPushMatrix事实上就是把当前状态做一个副本放入堆栈之中。
当你做了一些移动或旋转等变换后,使用glPushMatrix();
OpenGL 会把这个变换后的位置和角度保存起来。
然后你再随便做第二次移动或旋转变换,再用glPopMatrix();
OpenGL 就把刚刚保存的那个位置和角度恢复。
比方:
glLoadIdentity();
glTranslatef(1,0,0);//向右移动(1,0,0)
glPushMatrix();//保存当前位置
glTranslatef(0,1,0);//如今是(1,1,0)了
glPopMatrix();//这样,如今又回到(1,0,0)了
1.原理解说
最终明确为什么使用glPushMatrix()和glPopMatrix()的原因了。将本次须要运行的缩放、平移等操作放在glPushMatrix和glPopMatrix之间。glPushMatrix()和glPopMatrix()的配对使用能够消除上一次的变换对本次变换的影响。使本次变换是以世界坐标系的原点为參考点进行。以下对上述结论做进一步的解释:
1)OpenGL中的modelview矩阵变换是一个马尔科夫过程:上一次的变换结果对本次变换有影响,上次modelview变换后物体在世界坐标系下的位置是本次modelview变换的起点。默认时本次变换和上次变换不独立。
2)OpenGL物体建模实际上是分两步走的。第一步,在世界坐标系的原点位置绘制出该物体;第二步,通过modelview变换矩阵对世界坐标系原点处的物体进行仿射变换,将该物体移动到世界坐标系的目标位置处。
3)将modelview变换放在glPushMatrix和glPopMatrix之间能够使本次变换和上次变换独立。
4)凡是使用glPushMatrix()和glPopMatrix()的程序一般能够判定是采用世界坐标系建模。既世界坐标系固定,modelview矩阵移动物体。
glTranslatef()函数和glRotatef()函数和glLoadIdentity()函数
https://blog.csdn.net/code_ac/article/details/60970103
glLoadIdentity()
将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作
glTranslatef(x, y, z)
沿着 X, Y 和 Z 轴移动。
注意在glTranslatef(x, y, z)中,当您移动的时候,您并不是相对屏幕中心移动,而是相对与当前所在的屏幕位置。
glRotatef(angle, x, y, z)
与glTranslatef(x, y, z)类似,glRotatef(angle, x, y, z)也是对坐标系进行操作。 旋转轴经过原点,方向为(x,y,z),旋转角度为angle,方向满足右手定则。
glScalef是openGL中的模型缩放函数,就是把当前矩阵与一个表示延各个轴对物体进行拉伸、压缩、反射的矩阵相乘。这个物体的每个点的x,y,z坐标与对应的xyz参数相乘。
例如:
如glScalef(2.0f,3.0f,4.0f);将模型按x,y,z方向分别拉伸了2,3,4倍。
【GL_LINES】
独立的线段,下式中,p2与p3间没有连线。
【GL_LINE_STRIP】
连续的线段,下式中, p2与p3会连成线段。
【GL_LINE_LOOP】