OpenGL/GLES Notes

2018-07-18  本文已影响0人  CrystalDragon

@(Graphics)[OpenGL, OpenGLES]

OpenGL/GLES Notes

EGL

opengl和host app window system之间的glue层

使用egl进行绑定例程中, 主要创建的对象包括

iOS Apple自己有提供context: EAGLContext, 创建非常简单, 不需要使用到EGL.

Program Object & Shaders

从Host app向Shader传递数据有2种主要形式

Attributes

attribute的数据处理时是per vertex的, 但我们可以给所有vertex赋予不同, 也可以给相同的值. (后者在OpenGLES3.0 PG这本书中称为 constant vertex attribute)

当program编译并完成之后, 其attribute入参的相关meta data都确定了, 可以通过一些列query方法抽取.

注意: OpenGL里对类似GL_MAX_VERTEX_ATTRIBS这类state限制的解释: 都是以vec4为单位的, 如果出现数组或者struct或者mat4, 是按复数倍来计算的. 因此最终programmer真正能使用的active attribute的参数个数可能会少于GL_MAX_VERTEX_ATTRIBS. 即: 仍然是从0开始递增计数, 但上限会更小.

但一般host app在给shader提供具体data时, 并不会从program从头开始query参数来决定如何提供data, 而是根据先验的知识(例如location, name等)来决定提供data的方式.

VAO: vertex array pointer

如上所述, 在GLES3.0前, 有三种提供vertex attributes的方式

  1. constant vertex attribute glVertexAttrib
  2. client vertex array glVertexAttribPointer withglEnableVertexAttribArray
  3. VBO, glVertexAttribPointer with buffer bound to GL_ARRAY_BUFFER / GL_ELEMENT_ARRAY_BUFFER

事实上, 上述API更改的是当前active的VAO对象. 通过预先配置好不同的VAO, 并且实时切换, 可以快速提供一组新的对象给GPU绘制.
默认有一个VAO(id是0), glGenVertexArrays可以生成额外的, 不同的VAO用glBindVertexArray切换

Uniforms

Uniforms是全局constant, vertex shader和fragment shader中每次执行都获取相同的值. 但uniform有2种定义方式.

和vertex attributes一样, 可以从program中获取大量信息

named uniform block是gles 3.0新增概念, 对于uniform block本身也有metadata可以获取

Host app提供uniform data和attribute也有两种方式, trivial value/buffer. 同样我们一般拥有先验知识: uniform的name. 而想要提供数据, 无论如何, 也都需要首先获取到shader中uniform的位置.

Buffers

in gpu/ opengl controlled

Types

Copy

gpu memory 1 -> gpu memory 2

Map

gpu memory -> client

DrawCalls

Shaders

Vertex Shader

Fragment Shader

上一篇 下一篇

猜你喜欢

热点阅读