OpenGl 3.0 api

OpenGl 3.0

着色器

glCreateShader

创建着色器句柄, 返回一个非 0 的 shader 句柄

GLuint glCreateShader (GLenum type);

type 着色器类型有2种, 顶点着色器片段着色器

  • GL_VERTEX_SHADER
  • GL_FRAGMENT_SHADER

glShaderSource

定义着色器的代码源

void glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
  • shader 着色器对象的句柄(ID)
  • count 指定字符串和长度数组中的元素数
  • string 指定指向包含要加载到着色器的源代码的字符串的指针数组
  • length 指定字符串长度的数组

glCompileShader

void glCompileShader(GLuint shader);

编译着色器

glGetShaderiv

从着色器句柄返回一个参数

void glGetShaderiv (GLuint shader, GLenum pname, GLint *params);
  • shader 着色器对象的句柄(ID)

  • pname 指定着色器对象的参数(可以使用类型如下: )

    • GL_SHADER_TYPE
      shader_type:着色器类型
      用来判断并返回着色器类型,若是顶点着色器返回GL_VERTEX_SHADER,若为片元着色器返回GL_FRAGMENT_SHADER.

    • GL_DELETE_STATUS:
      detele status:删除状态
      判断着色器是否被删除,是返回GL_TRUE,否则返回GL_FALSE,

    • GL_COMPILE_STATUS:
      compile_status:编译状态
      用于检测编译是否成功,成功为GL_TRUE,否则为GL_FALSE.

    • GL_INFO_LOG_LENGTH:
      information log length: log是日志的意思,所以是返回着色器的信息日志的长度
      用于返回着色器的信息日志的长度,包括空终止字符(即存储信息日志所需的字符缓冲区的大小)。 如果着色器没有信息日志,则返回值0。

    • GL_SHADER_SOURCE_LENGTH:
      SHADER_SOURCE_LENGTH:着色器源码长度
      返回着色器源码长度,不存在则返回0;

  • params

    该函数的返回值的地址(错误返回值如下: )

    • GL_INVALID_ENUM: pname不是一个可接受的值。

    • GL_INVALID_VALUE: shader不是OpenGL生成的值。

    • GL_INVALID_OPERATION: 不支持着色器编译器的情况下查询 pname 为 GL_COMPILE_STATUS,GL_INFO_LOG_LENGTH 或 GL_SHADER_SOURCE_LENGTH(GL_SHADER_TYPE,GL_DELETE_STATUS 不会报这个错)

glGetShaderInfoLog

返回着色器对象的信息日志

void glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
  • shader 着色器对象的句柄(ID)
  • bufSize 指定用于存储返回的信息日志的字符缓冲区的大小
  • length 返回 infoLog 中返回的字符串的长度(不需要可以传 nullptr )
  • infoLog 指定用于返回信息日志的字符数组

glDeleteShader

删除着色器句柄

void glDeleteShader (GLuint shader);

shader 着色器对象的句柄(ID)

程序

glCreateProgram

创建程序, 返回一个非 0 的 program

GLuint glCreateProgram (void);

glAttachShader

将着色器对象附加到program对象

void glAttachShader (GLuint program, GLuint shader);
  • program 着色器的 program
  • shader 着色器对象的句柄(ID)

glLinkProgram

链接 program

void glLinkProgram (GLuint program);
  • program 着色器的 program

glGetProgramiv

从program对象返回一个参数的值

void glGetProgramiv (GLuint program, GLenum pname, GLint *params);
  • program 着色器的 program

  • pname 指定program对象参数(可以使用类型如下: )

    • GL_DELETE_STATUS

      如果program当前标记为删除,则params返回 GL_TRUE,否则返回GL_FALSE

    • GL_LINK_STATUS

      如果program的最后一个链接操作成功,则params返回GL_TRUE,否则返回GL_FALSE

    • GL_VALIDATE_STATUS

      params返回GL_TRUEprogram的最后一次验证操作成功了也返回GL_TRUE,否则返回GL_FALSE

    • GL_INFO_LOG_LENGTH

      params返回program信息日志中的字符数,包括空终止字符(即,存储信息日志所需的字符缓冲区的大小)。 如果程序没有信息日志,则返回值0。

    • GL_ATTACHED_SHADERS

      params返回附加到program的着色器对象的数量。

    • GL_ACTIVE_ATTRIBUTES

      params返回program的激活状态的属性变量数。

    • GL_ACTIVE_ATTRIBUTE_MAX_LENGTH

      params返回program的最长激活状态的属性名称的长度,包括空终止字符(即,存储最长属性名称所需的字符缓冲区的大小)。 如果不存在活动属性,则返回0。

    • GL_ACTIVE_UNIFORMS

      params返回program的激活状态的统一变量的数量。

    • GL_ACTIVE_UNIFORM_MAX_LENGTH

      params返回program*的最长激活状态的统一变量名称的长度,包括空终止字符(即,存储最长统一变量名称所需的字符缓冲区的大小)。 如果不存在活动的统一变量,则返回0。

  • 该方法的返回值

glGetProgramInfoLog

返回 program 对象的信息日志

void glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
  • program 着色器的 program
  • bufSize 指定用于存储返回的信息日志的字符缓冲区的大小
  • length 返回 infoLog 中返回的字符串的长度(不需要可以传 nullptr )
  • infoLog 指定用于返回信息日志的字符数组

glDeleteProgram

删除 program

void glDeleteProgram (GLuint program);

glGetAttribLocation

获取顶点属性变量(位置、纹理、颜色、法线)在着色器程序中的位置索引

GLint glGetAttribLocation (GLuint program, const GLchar *name);
  • program 着色器的 program
  • name 要查询其位置的属性变量的名称

glUseProgram

使用 program

void glUseProgram (GLuint program);

glVertexAttribPointer

指定了渲染时索引值为 index 的顶点属性数组的数据格式和位置

void glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
  • index 顶点属性的索引, 如果使用了 layout(location = numer) 那么这个 index 就是 number , 如果没有指定,

    可以使用 glGetAttribLocation 查询 index

  • size 顶点的属性大小, 如果是 vec4 那么就是 4 , 如果是 vec2 那么就是 2

  • type 指定数据的类型, 一般是 GL_FLOAT

  • normalized 使用归一化, 如果我们设置为GL_TRUE,所有数据都会被映射到0(对于有符号型signed数据是-1)到1之间。我们把它设置为GL_FALSE

  • stride 顶点属性的间隔, 使用上面的 size * sizeof(float)

  • pointer 顶点数组

glEnableVertexAttribArray

允许顶点着色器读取GPU(服务器端)数据

void glEnableVertexAttribArray (GLuint index);
  • index 顶点属性的索引, 如果使用了 layout(location = numer) 那么这个 index 就是 number , 如果没有指定,

    可以使用 glGetAttribLocation 查询 index

glGetUniformLocation

返回统一变量的位置

GLint glGetUniformLocation (GLuint program, const GLchar *name);
  • program 着色器的 program
  • name 要查询其位置的统一变量的名称

颜色

glClear

当前缓冲区清除值

void glClear (GLbitfield mask);
  • mask

    可以使用 | 运算符组合不同的缓冲标志位,表明需要清除的缓冲,例如 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)表示要清除颜色缓冲以及深度缓冲,可以使用以下标志位

    • GL_COLOR_BUFFER_BIT: 当前可写的颜色缓冲
    • GL_DEPTH_BUFFER_BIT: 深度缓冲
    • GL_ACCUM_BUFFER_BIT: 累积缓冲
    • GL_STENCIL_BUFFER_BIT: 模板缓冲

glClearColor

设置清除颜色

void glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);

glClearDepthf

指定深度缓冲区的清除值

void glClearDepthf (GLfloat d);
  • d 深度 返回 [0,1]

glClearStencil

指定模板缓冲区的清除值

void glClearStencil (GLint s);
  • s 指定清除模板缓冲区时使用的索引。 初始值为0。

绘图

glDrawElements

使用 count 个元素定义一个几何序列

void glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);
  • mode 可以是 GL_POLYGON、GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_LINE_STRIP 等。
  • count 一般是点的个数
  • type 指 indices 数组的数据类型, 一般是整型
  • indices 索引数组

glDrawArrays

提供绘制功能。当采用顶点数组方式绘制图形时,使用该函数。该函数根据顶点数组中的坐标数据和指定的模式,进行绘制

void glDrawArrays (GLenum mode, GLint first, GLsizei count);
  • mode 可以是 GL_POLYGON、GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_LINE_STRIP 等。
  • first 从数组缓存中的哪一位开始绘制, 一般都为 0
  • count 数组中顶点的数量

纹理

glGenTextures

生成纹理索引

void glGenTextures (GLsizei n, GLuint *textures);
  • n 生成纹理的数量
  • textures 存储纹理索引的第一个元素指针

glBindTexture

允许建立一个绑定到目标纹理的有名称的纹理

void glBindTexture (GLenum target, GLuint texture);
  • target 纹理被绑定的目标, 它的取值为 GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D、GL_TEXTURE_CUBE_MAP
  • texture 纹理的名称,并且,该纹理的名称在当前的应用中不能被再次使用。

glTexParameterf

OpenGL纹理过滤函数

void glTexParameterf (GLenum target, GLenum pname, GLfloat param);
  • target 纹理被绑定的目标, 它的取值为 GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D、GL_TEXTURE_CUBE_MAP
  • pname 此为要设置的纹理参数, 可以取值如下:GL_TEXTURE_MAG_FILTER,GL_TEXTURE_MIN_FILTER,GL_TEXTURE_WRAP_S,GL_TEXTURE_WRAP_T
  • param 要设置的纹理参数的值

pname 和 param 对应关系

pnameparam
GL_TEXTURE_MAG_FILTERGL_NEAREST、GL_LINEAR
GL_TEXTURE_MIN_FILTERGL_NEAREST、GL_LINEAR、GL_NEAREST_MIPMAP_NEAREST、GL_NEAREST_MIPMAP_LINEAR、GL_LINEAR_MIPMAP_NEAREST、GL_LINEAR_MIPMAP_LINEAR
GL_TEXTURE_WRAP_S、GL_TEXTURE_WRAP_TGL_REPEAT、GL_CLAMP_TO_EDGE、GL_MIRRORED_REPEAT

glActiveTexture

选择当前活跃的纹理单元

glActiveTexture 的实际范围可以通过 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS查询。这是最大可用的纹理单元数。它们被分为几组,给不同的shader阶段。比如 GL 3.x, 顶点着色器分得 16 个纹理单元,几何着色器和片元着色器同样也有16个。因此,GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 查询得到的最大值为48。

glActiveTexture(GL_TEXTURE0 + i); where i is a number between 0 and GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.
因此你应该这样调用 glActiveTexture(GL_TEXTURE0 + i); i 为 0 到 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS的整数

void glActiveTexture (GLenum texture);
  • texture 纹理枚举值

glTexImage2D

根据指定的参数,生成一个2D纹理, 在调用该函数之前,必须调用glBindTexture(GL_TEXTURE_2D, mTextureID );以指定要操作的纹理ID,此处是mTextureID

void glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
  • target 指定目标纹理,这个值必须是GL_TEXTURE_2D
  • level 执行细节级别。0是最基本的图像级别,n表示第N级贴图细化级别
  • internalformat 指定纹理中的颜色组件。可选的值有GL_ALPHA,GL_RGB,GL_RGBA,GL_LUMINANCE, GL_LUMINANCE_ALPHA 等几种
  • width 指定纹理图像的宽度,必须是2的n次方。纹理图片至少要支持64个材质元素的宽度
  • height 指定纹理图像的高度,必须是2的m次方。纹理图片至少要支持64个材质元素的高度
  • border 指定边框的宽度。必须为0
  • format 像素数据的颜色格式, 不需要和 internalformatt 取值必须相同。可选的值参考 internalformat
  • type 指定像素数据的数据类型。可以使用的值有GL_UNSIGNED_BYTE,GL_UNSIGNED_SHORT_5_6_5,GL_UNSIGNED_SHORT_4_4_4_4,GL_UNSIGNED_SHORT_5_5_5_1
  • pixels 指定内存中指向图像数据的指针

glUniform1i

纹理层和采样器地址进行绑定

void glUniform1i (GLint location, GLint v0);
  • location 着色器里的 layout 指定的值,如果没有指定使用, glGetUniformLocation 查询获取的值
  • v0 纹理层级 (从 0 开始)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OpenGL ES 3.0 英文版 第1章——OpenGL ES 3.0简介   第1章简单介绍OpenGL ES,概述了OpenGL ES 3.0图形管线,讨论了OpenGL ES 3.0的设计理念和限制,最后介绍了OpenGL ES 3.0中使用的一些约定和类型。   第2章——你好,三角形:一个OpenGL ES 3.0示例   第2章介绍绘制三角形的一个简单OpenGL ES 3.0示例。我们的目的是说明OpenGL ES 3.0程序的样子,向读者介绍一些API概念,并说明如何构建和运行OpenGL ES 3.0示例程序。   第3章——EGL简介   第3章介绍EGL——为OpenGL ES 3.0创建表面和渲染上下文的API。我们说明与原生窗口系统通信、选择配置和创建EGL渲染上下文及表面的方法,传授足够多的EGL知识,你可以了解到启动OpenGL ES 3.0进行渲染所需的所有知识。   第4章——着色器和程序   着色器对象和程序对象是OpenGL ES 3.0中最基本的对象。第4章介绍创建着色器对象、编译着色器和检查编译错误的方法。这一章还说明如何创建程序对象、将着色器对象连接到程序对象以及链接最终程序对象的方法。我们讨论如何查询程序对象的信息以及加载统一变量(uniform)的方法。此外,你将学习有关源着色器和程序二进制代码之间的差别以及它们的使用方法。   第5章——OpenGL ES着色语言   第5章介绍编写着色器所需的着色语言的基础知识。这些着色语言基础知识包括变量和类型、构造器、结构、数组、统一变量、统一变量块(uniform block)和输入/输出变量。该章还描述着色语言的某些更细微的部分,例如精度限定符和不变性。   第6章——顶点属性、顶点数组和缓冲区对象   从第6章开始(到第11章为止),我们将详细介绍管线,教授设置和编程图形管线各个部分的方法。这一旅程从介绍几何形状输入图形管线的方法开始,包含了对顶点属性、顶点数组和缓冲区对象的讨论。   第7章——图元装配和光栅化   在前一章讨论几何形状输入图形管线的方法之后,第7章将讨论几何形状如何装配成图元,介绍OpenGL ES 3.0中所有可用的图元类型,包括点精灵、直线、三角形、三角形条带和三角扇形。此外,我们还说明了在顶点上进行坐标变换的方法,并简单介绍了OpenGL ES 3.0管线的光栅化阶段。   第8章——顶点着色器   我们所介绍的管线的下一部分是顶点着色器。第8章概述了顶点着色器如何融入管线以及OpenGL ES 着色语言中可用于顶点着色器的特殊变量,介绍了多个顶点着色器的示例,包括逐像素照明和蒙皮(skinning)。我们还给出了用顶点着色器实现OpenGL ES 1.0(和1.1)固定功能管线的示例。   第9章——纹理   第9章开始介绍片段着色器,描述OpenGL ES 3.0中所有可用的纹理功能。该章提供了创建纹理、加载纹理数据以及纹理渲染的细节,描述了纹理包装模式、纹理过滤、纹理格式、压缩纹理、采样器对象、不可变纹理、像素解包缓冲区对象和Mip贴图。该章介绍了OpenGL ES 3.0支持的所有纹理类型:2D纹理、立方图、2D纹理数组和3D纹理。   第10章——片段着色器   第9章的重点是如何在片段着色器中使用纹理,第10章介绍编写片段着色器所需知道的其他知识。该章概述了片段着色器和所有可用的特殊内建变量,还演示了用片段着色器实现OpenGL ES 1.1中所有固定功能技术的方法。多重纹理、雾化、Alpha测试和用户裁剪平面的例子都使用片段着色器实现。   第11章——片段操作   第11章讨论可以适用于整个帧缓冲区或者在OpenGL ES 3.0片段管线中执行片段着色器后适用于单个片段的操作。这些操作包括剪裁测试、模板测试、深度测试、多重采样、混合和抖动。本章介绍OpenGL ES 3.0图形管线的最后阶段。   第12章——帧缓冲区对象   第12章讨论使用帧缓冲区对象渲染屏幕外表面。帧缓冲区对象有多种用法,最常见的是渲染到一个纹理。本章提供API帧缓冲区对象部分的完整概述。理解帧缓冲区对象对于实现许多高级特效(如反射、阴影贴图和后处理)至关重要。   第13章——同步对象和栅栏   第13章概述同步对象和栅栏,它们是在OpenGL ES 3.0主机应用和GPU执行中同步的有效图元。我们讨论同步对象和栅栏的使用方法,并以一个示例作为结束。   第14章——OpenGL ES 3.0高级编程   第14章是核心章节,将本书介绍的许多主题串联在一起。我们已经选择了高级渲染技术的一个样本,并展示了实现这些功能的示例。该章包含使用法线贴图的逐像素照明、环境贴图、粒子系统、图像后处理、程序纹理、阴影贴图、地形渲染
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值