介绍常用的OpenGL的函数(定义+功能)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了介绍常用的OpenGL的函数(定义+功能)相关的知识,希望对你有一定的参考价值。

RT

OpenGL 函数库相关的API有核心库(gl)、实用库(glu)、辅助库(aux)、实用工具库(glut)、窗口库(glx、agl、wgl)和扩展函数库等。从图1可以看出,gl是核心,glu是对gl的部分封装。glx、agl、wgl 是针对不同窗口系统的函数。glut是为跨平台的OpenGL程序的工具包,比aux功能强大。扩展函数库是硬件厂商为实现硬件更新利用OpenGL的扩展机制开发的函数。下面逐一对这些库进行详细介绍。
  1.OpenGL核心库  核心库包含有115个函数,函数名的前缀为gl。  这部分函数用于常规的、核心的图形处理。此函数由gl.dll来负责解释执行。由于许多函数可以接收不同数以下几类。据类型的参数,因此派生出来的函数原形多达300多个。  核心库中的函数主要可以分为以下几类函数:
  (1)绘制基本几何图元的函数。如绘制图元的函数glBegain()、glEnd()、glNormal*()、glVertex*()。
  (2)矩阵操作、几何变换和投影变换的函数。如矩阵入栈函数glPushMatrix()、矩阵出栈函数glPopMatrix()、装载矩阵函数glLoadMatrix()、矩阵相乘函数glMultMatrix(),当前矩阵函数 glMatrixMode()和矩阵标准化函数glLoadIdentity(),几何变换函数glTranslate*()、glRotate*()和 glScale*(),投影变换函数glOrtho()、glFrustum()和视口变换函数glViewport()等等。
  (3)颜色、光照和材质的函数。如设置颜色模式函数glColor*()、glIndex*(),设置光照效果的函数glLight*() 、glLightModel*()和设置材质效果函数glMaterial()等等。
  (4)显示列表函数、主要有创建、结束、生成、删除和调用显示列表的函数glNewList()、 glEndList()、glGenLists()、glCallList()和glDeleteLists()。
  (5)纹理映射函数,主要有一维纹理函数glTexImage1D()、二维纹理函数glTexImage2D()、 设置纹理参数、纹理环境和纹理坐标的函数glTexParameter*()、glTexEnv*()和glTetCoord*()等。
  (6)特殊效果函数。融合函数glBlendFunc()、反走样函数glHint()和雾化效果glFog*()。
  (7)光栅化、象素操作函数。如象素位置glRasterPos*()、线型宽度glLineWidth()、多边形绘制模式glPolygonMode(),读取象素glReadPixel()、复制象素glCopyPixel()等。
  (8)选择与反馈函数。主要有渲染模式glRenderMode()、选择缓冲区glSelectBuffer()和反馈缓冲区glFeedbackBuffer()等。
  (9)曲线与曲面的绘制函数。生成曲线或曲面的函数glMap*()、glMapGrid*(),求值器的函数glEvalCoord*() glEvalMesh*()。
  (10)状态设置与查询函数。主要有glGet*()、glEnable()、glGetError()等。
  2.OpenGL实用库The OpenGL Utility Library (GLU)  包含有43个函数,函数名的前缀为glu。  OpenGL提供了强大的但是为数不多的绘图命令,所有较复杂的绘图都必须从点。线、面开始。Glu 为了减轻繁重的编程工作,封装了OpenGL函数,Glu函数通过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操作。此函数由 glu.dll来负责解释执行。OpenGL中的核心库和实用库可以在所有的OpenGL平台上运行。  主要包括了以下几种:
  (1)辅助纹理贴图函数,有gluScaleImage() 、gluBuild1Dmipmaps()、gluBuild2Dmipmaps()。
  (2)坐标转换和投影变换函数,定义投影方式函数gluPerspective()、gluOrtho2D() 、gluLookAt(),拾取投影视景体函数gluPickMatrix(),投影矩阵计算gluProject()和 gluUnProject()等等。
  (3)多边形镶嵌工具,有gluNewTess()、 gluDeleteTess()、gluTessCallback()、gluBeginPolygon() gluTessVertex()、gluNextContour()、gluEndPolygon()等等。
  (4)二次曲面绘制工具,主要有绘制球面、锥面、柱面、圆环面gluNewQuadric()、gluSphere()、gluCylinder()、gluDisk()、gluPartialDisk()、gluDeleteQuadric()等等。
  (5)非均匀有理B样条绘制工具,主要用来定义和绘制Nurbs曲线和曲面,包括gluNewNurbsRenderer()、 gluNurbsCurve()、gluBeginSurface()、gluEndSurface()、gluBeginCurve()、 gluNurbsProperty()等函数。
  (6)错误反馈工具,获取出错信息的字符串gluErrorString()。
  3.OpenGL辅助库  包含有31个函数,函数名前缀为aux。  这部分函数提供窗口管理、输入输出处理以及绘制一些简单三维物体。此函数由glaux.dll来负责解释执行。创建aux库是为了学习和编写 OpenGL程序,它更像是一个用于测试创意的预备基础接管。Aux库在windows实现有很多错误,因此很容易导致频繁的崩溃。在跨平台的编程实例和演示中,aux很大程度上已经被glut库取代。OpenGL中的辅助库不能在所有的OpenGL平台上运行。  辅助库函数主要包括以下几类:
  (1)窗口初始化和退出函数,auxInitDisplayMode()和auxInitPosition()。
  (2)窗口处理和时间输入函数,auxReshapeFunc()、auxKeyFunc()和auxMouseFunc()。
  (3)颜色索引装入函数,auxSetOneColor()。
  (4)三维物体绘制函数。包括了两种形式网状体和实心体,如绘制立方体auxWireCube()和 auxSolidCube()。这里以网状体为例,长方体auxWireBox()、环形圆纹面auxWireTorus()、圆柱 auxWireCylinder()、二十面体auxWireIcosahedron()、八面体auxWireOctahedron()、四面体 auxWireTetrahedron()、十二面体auxWireDodecahedron()、圆锥体auxWireCone()和茶壶 auxWireTeapot()。
  (5)背景过程管理函数auxIdleFunc()。
  (6)程序运行函数auxMainLoop()。
  4.OpenGL工具库 OpenGL Utility Toolkit  包含大约30多个函数,函数名前缀为glut。  glut是不依赖于窗口平台的OpenGL工具包,由Mark KLilgrad在SGI编写(现在在Nvidia),目的是隐藏不同窗口平台API的复杂度。函数以glut开头,它们作为aux库功能更强的替代品,提供更为复杂的绘制功能,此函数由glut.dll来负责解释执行。由于glut中的窗口管理函数是不依赖于运行环境的,因此OpenGL中的工具库可以在X-Window, Windows NT, OS/2等系统下运行,特别适合于开发不需要复杂界面的OpenGL示例程序。对于有经验的程序员来说,一般先用glut理顺3D图形代码,然后再集成为完整的应用程序。  这部分函数主要包括:
  (1)窗口操作函数,窗口初始化、窗口大小、窗口位置等函数glutInit() glutInitDisplayMode() glutInitWindowSize() glutInitWindowPosition()等。
  (2)回调函数。响应刷新消息、键盘消息、鼠标消息、定时器函数等,GlutDisplayFunc() glutPostRedisplay() glutReshapeFunc() glutTimerFunc() glutKeyboardFunc() glutMouseFunc()。
  (3)创建复杂的三维物体。这些和aux库的函数功能相同。创建网状体和实心体。如glutSolidSphere()、glutWireSphere()等。在此不再叙述。
  (4)菜单函数。创建添加菜单的函数GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu() 和glutAttachMenu()。
  (5)程序运行函数,glutMainLoop()。
参考技术A 详见http://baike.baidu.com/view/9222.htm

音视频开发系列——Opengl常用Api介绍part1

GLES20.glTexParameteri

GLES20.glTexParameteri是OpenGL ES 2.0用于设置纹理过滤器和纹理包装模式的函数。它有三个参数:

target参数

target参数指定要设置纹理参数的纹理目标,根据不同的target值,glTexParameteri函数的行为也会有所不同。下面是几种常见的target类型及其应用场景:
GLES20.GL_TEXTURE_2D:二维纹理目标。适用于大多数的纹理贴图,例如游戏中的角色、地图、天空等。

GLES20.GL_TEXTURE_CUBE_MAP:立方体纹理目标。适用于渲染立方体贴图,例如游戏中的天空盒、反射贴图等。

GLES20.GL_TEXTURE_EXTERNAL_OES:用于外部纹理目标,一般用于媒体流、相机等场景。可以使用SurfaceTexture将纹理输出到屏幕或其他纹理中。

GLES20.GL_TEXTURE_3D:三维纹理目标。适用于体积渲染,例如医学影像、地质勘探等。

GLES31.GL_TEXTURE_BUFFER:缓冲区纹理目标。适用于从缓冲区中读取数据并渲染。

GLES31.GL_TEXTURE_RECTANGLE:矩形纹理目标。可以用于需要快速绘制2D图形的场景,例如UI渲染、HUD显示等。

GLES30.GL_TEXTURE_2D_ARRAY:二维数组纹理目标。适用于渲染大量的重叠或不同分辨率的纹理,例如地图瓦片、卫星图像等。

GLES31.GL_TEXTURE_CUBE_MAP_ARRAY:立方体贴图数组目标。适用于同时渲染多个立方体贴图,例如游戏中的动态天空、多视角渲染等。

总之,不同的纹理目标适用于不同的场景,开发者需要根据具体的需求选择合适的目标类型,以达到最佳的渲染效果和性能。

pname

参数指定了要设置的纹理参数的名称,可以是以下值之一:
GL_TEXTURE_MIN_FILTER: 指定当纹理被缩小时如何过滤纹理像素,可以是GL_NEAREST(最近邻过滤)、GL_LINEAR(线性过滤)、GL_NEAREST_MIPMAP_NEAREST(使用最近邻过滤的Mipmap纹理)、GL_NEAREST_MIPMAP_LINEAR(使用线性过滤的Mipmap纹理)、GL_LINEAR_MIPMAP_NEAREST(使用最近邻过滤的Mipmap纹理)或GL_LINEAR_MIPMAP_LINEAR(使用线性过滤的Mipmap纹理)。

GL_TEXTURE_MAG_FILTER: 指定当纹理被放大时如何过滤纹理像素,可以是GL_NEAREST(最近邻过滤)或GL_LINEAR(线性过滤)。

GL_TEXTURE_WRAP_S和GL_TEXTURE_WRAP_T: 指定纹理坐标超出范围时应如何处理,可以是GL_CLAMP_TO_EDGE(纹理坐标会被截断为范围内的最大/最小值)、GL_REPEAT(纹理坐标将被重复)或GL_MIRRORED_REPEAT(纹理坐标将被重复,但是在每次重复时都会镜像翻转)。

param

参数指定了纹理参数的值,根据设置的参数不同可以有不同的取值,例如:
GL_NEAREST:使用最近邻过滤。

GL_LINEAR:使用线性过滤。

GL_CLAMP_TO_EDGE:纹理坐标会被截断为范围内的最大/最小值。

GL_REPEAT:纹理坐标将被重复。

GL_MIRRORED_REPEAT:纹理坐标将被重复,但是在每次重复时都会镜像翻转。

总之,GLES20.glTexParameteri函数可以用来控制纹理如何被过滤和包装,以及如何在纹理坐标超出范围时进行处理。

    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR)
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR)
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE)
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE)

Matrix.setIdentityM

Matrix.setIdentityM() 是 Android 的一个矩阵操作方法,它用于将一个矩阵设置为单位矩阵。单位矩阵是一个主对角线上所有元素都为1,其余元素都为0的方阵。

该方法的完整签名如下:

public static void setIdentityM(float[] sm, int smOffset)

其中,参数 sm 表示一个float类型的一维数组,它是要被设置为单位矩阵的目标矩阵。参数 smOffset 表示要设置的目标矩阵的起始位置。

该方法将目标矩阵从起始位置开始的元素设置为单位矩阵。由于Java中的数组下标从0开始,因此第一个元素的索引是 smOffset,而不是1。

以下是该方法的实现示例:

public static void setIdentityM(float[] sm, int smOffset) 
    for (int i = 0; i < 16; i++) 
        sm[smOffset + i] = ((i % 5 == 0) ? 1.0f : 0.0f);
    


该实现通过一个循环遍历了矩阵的所有元素。对于每个元素,如果它在主对角线上,则将其设置为1,否则设置为0。

使用该方法可以方便地将一个矩阵设置为单位矩阵,从而方便后续的矩阵操作。

Matrix.setIdentityM(stMatrix, 0);

将矩阵 stMatrix 设置为单位矩阵。单位矩阵是一种特殊的矩阵,它不改变顶点的位置或方向。

为什么要调用setIdentityM设置为单位矩阵?
在 OpenGL 中,变换矩阵是用来对 3D 场景中的顶点进行变换的。每个变换操作(例如平移、旋转、缩放等)都可以表示为一个矩阵,这些矩阵可以组合使用来实现复杂的变换效果。

在进行变换矩阵的组合时,必须确保在最初的状态下,即没有进行任何变换时,变换矩阵的值是正确的。如果不是这样,那么组合变换操作时可能会导致意外的结果。

因此,在设置任何其他的变换操作之前,通常需要先将变换矩阵初始化为一个单位矩阵。单位矩阵是一种特殊的矩阵,它可以确保在组合变换操作时不会对顶点进行任何意外的变换。

因此,首先调用 Matrix.setIdentityM(stMatrix, 0) 方法将 stMatrix 矩阵设置为单位矩阵,以确保在应用任何其他变换之前,矩阵的值是正确的。

每次执行矩阵操作之前都需要调用setIdentityM吗?
在大多数情况下,不需要在每次执行变换矩阵操作之前都调用 setIdentityM 方法。通常情况下,只需要在创建变换矩阵时调用一次 setIdentityM 方法来初始化矩阵即可。

在接下来的变换操作中,可以直接对这个矩阵进行修改。例如,如果需要对一个顶点进行平移和旋转,可以先创建一个矩阵,然后使用 translateM 方法对其进行平移操作,使用 rotateM 方法对其进行旋转操作。在进行每个操作之前,不需要再调用 setIdentityM 方法。

但是,如果在多个变换操作之间需要重新开始,例如在处理多个对象时,可能需要将变换矩阵重置为单位矩阵,然后重新开始应用变换操作。在这种情况下,可以再次使用 setIdentityM 方法来将矩阵重置为单位矩阵。

Matrix.scaleM

用于将一个缩放矩阵应用于给定的矩阵。它的参数如下:

public static void scaleM(float[] m, int mOffset, float x, float y, float z)

m:要被缩放的矩阵,表示为一个长度为 16 的浮点数数组。
mOffset:矩阵中第一个元素的偏移量。
x:x 轴的缩放因子。
y:y 轴的缩放因子。
z:z 轴的缩放因子。

这些参数的含义如下:
m:这是一个长度为 16 的浮点数数组,表示要进行缩放操作的矩阵。缩放矩阵会将矩阵的每个元素乘以一个缩放因子,从而使得矩阵中的每个向量在对应的轴上被缩放。矩阵中的元素按照以下方式排列:

m[0]  m[4]  m[8]   m[12]
m[1]  m[5]  m[9]   m[13]
m[2]  m[6]  m[10]  m[14]
m[3]  m[7]  m[11]  m[15]

mOffset:这是矩阵中第一个元素的偏移量。如果要对整个矩阵进行缩放操作,则将 mOffset 设置为 0。如果只想缩放矩阵的一部分,可以将 mOffset 设置为相应的偏移量。
x:这是要应用于 x 轴的缩放因子。这个因子应该是一个浮点数,通常是大于 0 的数。如果该值为 1,则不会对矩阵进行任何缩放。如果该值大于 1,则会使矩阵在 x 轴方向上扩大;如果该值小于 1,则会使矩阵在 x 轴方向上缩小。
y:这是要应用于 y 轴的缩放因子,其含义与 x 轴相同。
z:这是要应用于 z 轴的缩放因子,其含义与 x 轴相同。
使用这些参数,Matrix.scaleM() 方法将计算一个缩放矩阵,并将其应用于给定的矩阵中。

针对于mOffset参数的理解
假设我们有一个 4x4 的矩阵 matrix,它表示了一个对象的变换矩阵,我们只想对这个矩阵的旋转部分进行缩放操作,而不想影响矩阵的平移部分。这时,我们可以将 mOffset 设置为矩阵中旋转部分的起始位置,然后调用 Matrix.scaleM() 方法对旋转部分进行缩放。

例如,假设我们的矩阵中的前三列表示了对象的旋转部分,而最后一列表示了对象的平移部分。我们可以将 mOffset 设置为 0,然后将 x、y、z 缩放因子设置为 1、2、1,以便只对旋转部分进行 y 轴方向上的缩放:

Matrix.scaleM(matrix, 0, 1, 2, 1);

这个方法会将矩阵的前三列中的所有元素乘以 1、2、1,从而对旋转部分进行 y 轴方向上的缩放。由于我们将 mOffset 设置为 0,因此这个操作只会影响前三列的元素,而不会影响最后一列的元素。这样,我们就可以只对矩阵的一部分进行缩放,而不影响其他部分。

glGetUniformLocation

Uniform变量是在着色器之间共享的全局变量,它们可以在多个绘制调用之间保持不变。可以使用glGetUniformLocation函数获取Uniform变量的位置,以便更新它们的值。

glGetUniformLocation函数的定义如下:

GLint glGetUniformLocation(GLuint program, const GLchar* name);

其中,program参数是一个已经连接的着色器程序对象的标识符,name参数是Uniform变量的名称。该函数返回Uniform变量的位置,如果Uniform变量未被找到,则返回-1。

例如,如果我们有以下的顶点着色器:

#version 330

uniform mat4 modelViewProjectionMatrix;

layout(location = 0) in vec4 position;

void main()

    gl_Position = modelViewProjectionMatrix * position;


我们可以使用以下代码获取Uniform变量的位置并将其更新为一个新的4x4矩阵:

GLuint program = // 已连接的着色器程序对象
GLint matrixLocation = glGetUniformLocation(program, "modelViewProjectionMatrix");

float matrixData[16] = // 新的4x4矩阵数据
glUniformMatrix4fv(matrixLocation, 1, GL_FALSE, matrixData);

在这个例子中,我们首先使用glGetUniformLocation函数获取了Uniform变量的位置。然后,我们使用glUniformMatrix4fv函数将新的4x4矩阵数据传递给该Uniform变量。glUniformMatrix4fv函数指定了Uniform变量的位置、要更新的矩阵数量、是否要转置矩阵数据以及矩阵数据的指针。

总之,glGetUniformLocation是一个很有用的函数,它使得我们能够在OpenGL程序中动态更新Uniform变量。

以上是关于介绍常用的OpenGL的函数(定义+功能)的主要内容,如果未能解决你的问题,请参考以下文章

计算机图形学openGL常用函数

Swift OpenGL ES 自定义常用滤镜

音视频开发系列——Opengl常用Api介绍part1

常用的基础模块介绍

Python常用内置函数介绍

# OpenGL常用函数详解(持续更新)