Skip to content

Latest commit

 

History

History
106 lines (91 loc) · 5.25 KB

opengl_native_api.md

File metadata and controls

106 lines (91 loc) · 5.25 KB

Android OpenGL Native API

参考资料

头文件

#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>

CMakeLists.txt

target_link_libraries (
    ...
    EGL
    GLESv2
)

GLShader

GLuint GL_APIENTRY glCreateShader (GLenum type);
REF: glCreateShader()
用于创建一个Shader, 其中GLenum是Shader类型, 常用的有两种:

  • GL_VERTEX_SHADER
  • GL_FRAGMENT_SHADER
  • GL_GEOMETRY_SHADER

void glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
REF: glShaderSource()
用于绑定Shader源码到已经创建的Shader, 参数1是shader id, 参数2是有几组源文件, 参数3是源码的string *列表, 参数4是源码长度, 可以为空.

void glCompileShader( GLuint shader);
REF: glCompileShader()
用于编译源码, 前提是必须调用glShaderSource()对Shader进行过配置

void glGetShaderiv (GLuint shader, GLenum pname, GLint *params);
REF: glGetShaderiv()
用于获取Shader的信息, 参数1是shader id, 参数2是需要获取的参数类型, 参数3是参数的存放位置, 一般参数类型GLenum可选的有:

  • GL_SHADER_TYPE 返回Shader类型, 类型一般有: GL_VERTEX_SHADER, GL_FRAGMENT_SHADERGL_GEOMETRY_SHADER三种
  • GL_DELETE_STATUS 返回Shader是否被删除, 返回GL_TRUE是已经被删除, 否则GL_FALSE为没有被删除.
  • GL_COMPILE_STATUS 获取Shader的编译状态, 如果是GL_TRUE表示编译成功, 如果是GL_FALSE表示编译遇到错误.
  • GL_INFO_LOG_LENGTH 获取Log信息的长度, 一般用于GL_COMPILE_STATUS结果为GL_FALSE的情况下获取Log
  • GL_SHADER_SOURCE_LENGTH 获取Shader的源码长度 为何不能获取Log? 因为获取Log有专门的函数:glGetShaderInfoLog()

void glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
REF: glGetShaderInfoLog()
用于获取编译的Log输出, 参数1是shader id, 参数2是buffer的长度(可以理解为:maxLength), 参数3是实际返回的长度, 参数4是log的输出buffer地址

void glDeleteShader (GLuint shader);
REF: glDeleteShader()
用于删除一个Shader, 只需要shader id做参数

GLProgram

GLuint glCreateProgram (void);
REF: glCreateProgram()
注意: REF提及了一些辅助函数, 应特别留意
用于创建一个GL程序GLProgram, 这是一个抽象概念, 表示一个可运行的实体, 它将和一个GLShader绑定, 以执行其代码.

void glAttachShader (GLuint program, GLuint shader);
REF: glAttachShader()
关联一个Shader到GLProgram, 这是显然的. 一个GLProgram可以Attach到多个GLShader上, Attach完成后, 需要执行Link操作, 将多个Shader Link到一起, 使用的函数为:glLinkProgram()

void glLinkProgram (GLuint program);
REF: glLinkProgram()
这是一个单纯对GLProgram的操作, 是其关联到的GLShader组成一个完整的GLProgram.

void glGetProgramiv (GLuint program, GLenum pname, GLint *params);
REF: glGetProgram()
获取GLProgram的输出, 有很多的可选参数(仅介绍GL_LINK_STATUSGL_INFO_LOG_LENGTH):

  • GL_DELETE_STATUS
  • GL_LINK_STATUS 获取Link的状态, GL_TRUE表示成功, GL_FALSE表示失败, 需要先获取GL_INFO_LOG_LENGTH, 然后使用glGetProgramInfoLog()方法获取Log的输出.
  • GL_VALIDATE_STATUS
  • GL_INFO_LOG_LENGTH 获取Link的Log长度, 结果将会保存在参数3中所指的buffer
  • GL_ATTACHED_SHADERS
  • GL_ACTIVE_ATOMIC_COUNTER_BUFFERS
  • GL_ACTIVE_ATTRIBUTES
  • GL_ACTIVE_ATTRIBUTE_MAX_LENGTH
  • GL_ACTIVE_UNIFORMS
  • GL_ACTIVE_UNIFORM_BLOCKS
  • GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH
  • GL_ACTIVE_UNIFORM_MAX_LENGTH
  • GL_COMPUTE_WORK_GROUP_SIZE
  • GL_PROGRAM_BINARY_LENGTH
  • GL_TRANSFORM_FEEDBACK_BUFFER_MODE
  • GL_TRANSFORM_FEEDBACK_VARYINGS
  • GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH
  • GL_GEOMETRY_VERTICES_OUT
  • GL_GEOMETRY_INPUT_TYPE
  • GL_GEOMETRY_OUTPUT_TYPE

void glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
REF: glGetProgramInfoLog()
用法和glGetShaderInfoLog()一致

void glDeleteProgram( GLuint program);
REF: glDeleteProgram()
用来删除一个GLProgram, 只需要提供GLProgram的id即可.