OpenGL ES シェーダープログラミング


## 概要
- 本家[KHRONOS](http://khronos.org/opengles)のサイト


- 本家[KHRONOS](http://jp.khronos.org/opengles)の日本語サイト

日本語サイトは情報が古く、2.Xまでのものしかなく、リンク切れも多いです。

バージョン

- 1.X
	- OpenGLES1.0は、OpenGL1.3ベース
	- OpenGLES1.1は、OpenGL1.5ベース
	- 固定機能パイプライン

- 2.X
	- OpenGLES2.0は、OpenGL2.0ベース
	- プログラマブルパイプライン
	- 頂点シェーダーとフラグメントシェーダー

- 3.X	
	- OpenGLES3.0
		- DirectX10相当の機能の追加
		- ジオメトリーシェーダーなし
	- OpenGLES3.1
		- DirectX11相当の機能の追加
		- コンピュートシェーダーの導入
		- ジオメトリーシェーダー、テッセレーションなし

## GLのデータ型

| GL型     | 最小ビット幅 | 説明         |
|:---------|---:|:-----------:|
| boolean  |  1 | ブール値      |
| byte     |  8 | 符号付き２進数 |
| ubyte    |  8 | 符号なし２進数 |
| char     |  8 | 文字列用の文字 |
| short    | 16 | 符号付き２進数 |
| ushort   | 16 | 符号なし２進数 |
| int      | 32 | 符号付き２進数 |
| uint     | 32 | 符号なし２進数 |
| float    | 32 | 浮動小数点数   |
| clampf   | 32 | 0〜1に制限された浮動小数点数 |
| fixed    | 32 | 符号付き固定小数点数 |
| sizei    | 32 | ０以上２進数によるサイズ |
| enum     | 32 | ２新数値の列挙 |
| bitfield | 32 | ビットフィールド |
| intptr   | ptrbits | 符号付き２進数 |
| sizeiptr | ptrbits | ０以上の２進数によるサイズ |

## 頂点と頂点配列
### 頂点
#### 頂点のAttribute変数を設定
```C++
void VertexAttrib{1234}{f}(uint index, T values);
void VertexAttrib{1234}{f}v(uint index, T values);
```

### 頂点配列
#### 頂点Atributeの位置の指定
```C++
void VertexAttribPointer(uint index, int size, enum type, boolean normalized, sizei stride, const void *pointer);
```
- type: BYTE, UNSIGNED_BYTE, SHORT, UNSIGNED_SHORT, FIXED, FLOAT
- index: [0, MAX_VERTEX_ATTRIBS - 1]

#### 頂点Attribute配列を使う／使わない
```C++
void EnableVertexAttribArray(uint index);
void DisableVertexAttribArray(uint index);
```
- index: [0, MAX_VERTEX_ATTRIBS - 1]

#### インデックスなし頂点の描画
```C++
void DrawArrays(enum mode, int first, sizei count);
```

#### インデックスあり頂点の描画
```C++
void DrawElements(enum mode, sizei count, enum type, void *indices);
```
- mode: POINTS, LINE_STRIP, LINE_LOOP, LINES, TRIANGLE_STRIP, TRIANGLE_FAN, TRIANGLES
- type: UNSIGNED_BYTE, UNSIGNED_SHORT


## シェーダーとプログラム
### シェーダーオブジェクト
#### シェーダーの作成
```C++
uint CreateShader(enum type);
```
- type: VERTEX_SHADER, FRAGMENT_SHADER

#### シェーダーのソースの指定
```C++
void ShaderSource(uint shader, sizei count, const char **string, const int *length);
```

#### シェーダーのコンパイル
```C++
void CompileShader(uint shader);
```

#### シェーダーの解放
```C++
void ReleaseShaderCompiler(void);
```

#### シェーダーの削除
```C++
void DeleteShader(uint shader);
```

#### シェーダーバイナリのロード
```C++
void ShaderBinary(sizei count, const uint *shaders, enum binaryformat, const void *binary, sizei length);
```

### プログラムオブジェクト
#### シェーダープログラムの作成
```C++
uint CreateProgram(void);
```

#### シェーダーのアタッチ
```C++
void AttachShader(uint program, uint shader);
```
#### シェーダーのデタッチ
```C++
void DetachShader(uint program, uint shader);
```

#### シェーダーオブジェクトのリンク
```C++
void LinkProgram(uint program);
```

#### 使用するシェーダーの指定
```C++
void UseProgram(uint program);
```

#### シェーダープログラムの削除
```C++
void DeleteProgram(uint program);
```

## Attrbute変数とUniform変数
### 頂点Attrbute変数
#### アクティブなAttribute変数の取得
```C++
void GetActiveAttrib(uint program, uint index, sizei bufSize, sizei *length, int *size, enum *type, char *name);
```
- *type 戻り値: FLOAT, FLOAT_VEC{2,3,4}, FLOAT_MAT{2,3,4} 

#### Attribute変数の位置の取得
```C++
int GetAttribLocation(uint program, const char *name);
```

#### Attribute変数と結合
```C++
void BindAttribLocation(uint program, uint index, const char *name);
```

### Uniform変数
#### Uniform変数の位置の取得
```C++
int GetUniformLocation(uint program, const char *name);
```

#### アクティブなUniform変数の取得
```C++
void GetActiveUniform(uint program, uint index, sizei bufSize, sizei *length, int *size, enum *type, char *name);
```
- *type: FLOAT, FLOAT_VEC{2,3,4}, INT, INT_VEC{2,3,4}, BOOL, BOOL_VEC{2,3,4}, FLOAT_MAT{2,3,4}, SAMPLER_2D, SAMPLER_CUBE

#### Uniform変数に値を設定
```C++
void Uniform{1234}{if}(int location, T value);
void Uniform{1234}{if}v(int location, sizei count, T value);
void UniformMatrix{234}fv(int location, sizei count, boolean transpose, const float *value);
```
- transpose: FALSE

### シェーダーのチェック
#### シェーダーの妥当性チェック
```C++
void ValidateProgram(uint program);
```

### シェーダーへの問い合わせ
#### シェーダーがあるか？
```C++
boolean IsShader(uint shader);
```

#### シェーダーの値の取得
```C++
void GetShaderiv(uint shader, enum pname, int *params);
```
- pname: SHADER_TYPE, DELETE_STATUS, COMPILE_STATUS, INFO_LOG_LENGTH,　SHADER_SOURCE_LENGTH

#### アタッチされたシェーダーの取得
```C++
void GetAttachedShaders(uint program, sizei maxCount, sizei *count, uint *shaders);
```

#### シェーダーのログを取得
```C++
void GetShaderInfoLog(uint shader, sizei bufSize, sizei *length, char *infoLog);
```

#### シェーダーのソースを取得
```C++
void GetShaderSource(uint shader, sizei bufSize, sizei *length, char *source);
```

#### シェーダーの精度形式を取得
```C++
void GetShaderPrecisionFormat(enum shadertype, enum precisiontype, int *range, int *precision);
```
- shadertype: VERTEX_SHADER, FRAGMENT_SHADER
- precision: LOW_FLOAT, MEDIUM_FLOAT, HIGH_FLOAT, LOW_INT, MEDIUM_INT, HIGH_INT

#### 頂点Attribute変数の値の取得
```C++
void GetVertexAttribfv(uint index, enum pname, float *params);
```
- pname: CURRENT_VERTEX_ATTRIB , VERTEX_ATTRIB_ARRAY_x (x は BUFFER_BINDING, ENABLED, SIZE, STRIDE, TYPE, NORMALIZED)

```C++
void GetVertexAttribiv(uint index, enum pname, int *params);
```
- pname: CURRENT_VERTEX_ATTRIB , VERTEX_ATTRIB_ARRAY_x (x は BUFFER_BINDING, ENABLED, SIZE, STRIDE, TYPE, NORMALIZED)

```C++
void GetVertexAttribPointerv(uint index, enum pname, void **pointer);
```
- pname: VERTEX_ATTRIB_ARRAY_POINTER

#### Uniform変数の値の取得
```C++
void GetUniformfv(uint program, int location, float *params)
void GetUniformiv(uint program, int location, int *params)
```

### プログラムへの問い合わせ
#### シェーダープログラムがあるか？
```C++
boolean IsProgram(uint program);
```

#### シェーダープログラムの取得
```C++
void GetProgramiv(uint program, enum pname, int *params);
```
- pname: DELETE_STATUS, LINK_STATUS, VALIDATE_STATUS, INFO_LOG_LENGTH, ATTACHED_SHADERS, ACTIVE_ATTRIBUTES, ACTIVE_ATTRIBUTE_MAX_LENGTH, ACTIVE_UNIFORMS, ACTIVE_UNIFORM_MAX_LENGTH

- シェーダープログラムのログの取得
```C++
void GetProgramInfoLog(uint program, sizei bufSize, sizei *length, char *infoLog);
```

## フラグメント前の操作
### シザーテスト
#### 有効／無効
```C++
Enable/Disable(SCISSOR_TEST)
```

- シザー範囲の指定
void Scissor(int left, int bottom, sizei width, sizei height );

### マルチサンプリングフラグメント操作
#### 有効／無効
```C++
Enable/Disable(cap)
```
- cap: SAMPLE_ALPHA_TO_COVERAGE, SAMPLE_COVERAGE

#### サンプリング範囲の指定
```C++
void SampleCoverage(clampf value, boolean invert);
```

### ステンシルテスト
#### 有効／無効
```C++
Enable/Disable(STENCIL_TEST)
```

#### ステンシル関数の指定
```C++
void StencilFunc(enum func, int ref, uint mask);
```

#### ステンシル関数の個別指定
```C++
void StencilFuncSeparate(enum face, enum func, int ref, uint mask);

```
#### ステンシル操作の指定
```C++
void StencilOp(enum sfail, enum dpfail, enum dppass);
```

#### ステンシル操作の個別指定
```C++
void StencilOpSeparate(enum face, enum sfail, enum dpfail, enum dppass);
```
- face: FRONT, BACK, FRONT_AND_BACK
- sfail, dpfail, dppass: KEEP, ZERO, REPLACE, INCR, DECR, INVERT, INCR_WRAP, DECR_WRAP
- func: NEVER, ALWAYS, LESS, LEQUAL, EQUAL, GREATER, GEQUAL, NOTEQUAL

### 深度テスト
#### 有効／無効
```C++
Enable/Disable(DEPTH_TEST)
```

#### 深度テスト関数の指定
```C++
void DepthFunc(enum func);
```
- func: NEVER, ALWAYS, LESS, LEQUAL, EQUAL, GREATER, GEQUAL, NOTEQUAL

### ブレンディング
#### 有効／無効
```C++
Enable/Disable(BLEND) (applies to all draw buffers)
```

#### ブレンディング式の指定
```C++
void BlendEquation(enum mode);
```

#### ブレンディング式の個別指定
```C++
void BlendEquationSeparate(enum modeRGB, enum modeAlpha);
```

- mode, modeRGB, modeAlpha: FUNC_ADD, FUNC_SUBTRACT, FUNC_REVERSE_SUBTRACT

#### ブレンディング関数の個別指定
```C++
void BlendFuncSeparate(enum srcRGB, enum dstRGB, enum srcAlpha, enum dstAlpha);
```

#### ブレンディング関数の指定
```C++
void BlendFunc(enum src, enum dst);
```
- dst, dstRGB, dstAlpha: ZERO, ONE, [ONE_MINUS_]SRC_COLOR, [ONE_MINUS_]DST_COLOR,[ONE_MINUS_]SRC_ALPHA, [ONE_MINUS_]DST_ALPHA, [ONE_MINUS_]CONSTANT_COLOR, [ONE_MINUS_]CONSTANT_ALPHA
- src, srcRGB, srcAlpha: dstと同じ + SRC_ALPHA_SATURATE

```C++
void BlendColor(clampf red, clampf green, clampf blue, clampf alpha);
```

### ディザ
#### 有効／無効
```C++
Enable/Disable(DITHER)
```

## フレームバッファ操作
#### 色マスクの指定
```C++
void ColorMask(boolean r, boolean g, boolean b, boolean a);
```

#### 深度マスクの指定
```C++
void DepthMask(boolean mask);
```

#### ステンシルマスクの指定
```C++
void StencilMask(uint mask);
```

#### ステンシルマスクの個別指定
```C++
void StencilMaskSeparate(enum face, uint mask);
```
- face: FRONT, BACK, FRONT_AND_BACK

#### バッファのクリア
```C++
void Clear(bitfield buf);
```
- buf: COLOR_BUFFER_BIT, DEPTH_BUFFER_BIT, STENCIL_BUFFER_BIT　のビットごとのOR

#### 色バッファのクリア
```C++
void ClearColor(clampf r, clampf g, clampf b, clampf a);
```
#### 深度バッファのクリア
```C++
void ClearDepthf(clampf d);
```
#### ステンシルバッファのクリア
```C++
void ClearStencil(int s);

```
### フレームバッファの結合と管理
#### フレームバッファの結合
```C++
void BindFramebuffer(enum target, uint framebuffer);
```
- target: FRAMEBUFFER 

### フレームバッファの削除
```C++
void DeleteFramebuffers(sizei n, uint *framebuffers);
```
#### フレームバッファの取得
```C++
void GenFramebuffers(sizei n, uint *framebuffers);
```

### レンダリングバッファオブジェクト
#### レンダリングバッファの結合
```C++
void BindRenderbuffer(enum target, uint renderbuffer);
```
- target: RENDERBUFFER

#### レンダリングバッファの削除
```C++
void DeleteRenderbuffers(sizei n, const uint *renderbuffers);
```
#### レンダリングバッファ配列の作成
```C++
void GenRenderbuffers(sizei n, uint *renderbuffers);
```
#### レンダリングバッファストレージの指定
```C++
void RenderbufferStorage(enum target, enum internalformat, sizei width, sizei height);
```
- target: RENDERBUFFER
- internalformat: DEPTH_COMPONENT16, RGBA4, RGB5_A1, RGB565, STENCIL_INDEX8 

#### レンダリングバッファ画像のフレームバッファへのアタッチ
```C++
void FramebufferRenderbuffer(enum target, enum attachment, enum renderbuffertarget, uint renderbuffer);
```
- target: FRAMEBUFFER
- attachment: COLOR_ATTACHMENT0, DEPTH_ATTACHMENT, STENCIL_ATTACHMENT
- renderbuffertarget: RENDERBUFFER

#### テクスチャ画像のフレームバッファへのアタッチ
```C++
void FramebufferTexture2D(enum target, enum attachment, enum textarget, uint texture, int level);
```
- textarget: TEXTURE_2D, TEXTURE_CUBE_MAP_POSITIVE{X, Y, Z}, TEXTURE_CUBE_MAP_NEGATIVE{X, Y, Z}, 
- target: FRAMEBUFFER
- attachment: COLOR_ATTACHMENT0, DEPTH_ATTACHMENT, STENCIL_ATTACHMENT

#### フレームバッファをチェック
```C++
enum CheckFramebufferStatus(enum target);
```
- target: FRAMEBUFFER
- returns: FRAMEBUFFER_COMPLETE or a constant indicating which value violates framebuffer completeness

### フレームバッファオブジェクトへの問い合わせ
#### フレームバッファがあるか？
```C++
boolean IsFramebuffer(uint framebuffer);
```

#### フレームバッファのパラメータの取得
```C++
void GetFramebufferAttachmentParameteriv(enum target, enum attachment, enum pname, int *params);
```
- target: FRAMEBUFFER
- attachment: COLOR_ATTACHMENT0, DEPTH_ATTACHMENT, STENCIL_ATTACHMENT
- pname: FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE,FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE

### レンダリングバッファへの問い合わせ
#### レンダリングバッファがあるか？
```C++
boolean IsRenderbuffer(uint renderbuffer);
```

#### レンダリングバッファのパラメータの取得
```C++
void GetRenderbufferParameteriv(enum target, enum pname, int *params);
```
- target: RENDERBUFFER
- pname: RENDERBUFFER_x (x は WIDTH, HEIGHT, RED_SIZE, GREEN_SIZE, BLUE_SIZE, ALPHA_SIZE, DEPTH_SIZE, STENCIL_SIZE, INTERNAL_FORMAT)

## その他
#### 単純な問い合わせ
```C++
void GetBooleanv(enum value, boolean *data);
void GetIntegerv(enum value, int *data);
void GetFloatv(enum value, float *data);
boolean IsEnabled(enum value);
```

#### ポインタと文字列での問い合わせ
```C++
ubyte *GetString(enum name); 
```
- name: VENDOR, RENDERER, VERSION, SHADING_LANGUAGE_VERSION, EXTENSIONS

#### バッファフラッシュと終了
```C++
void Flush(void);
void Finish(void);
```

#### ヒント
```C++
void Hint(enum target, enum hint);
```
- target: GENERATE_MIPMAP_HINT
- hint: FASTEST, NICEST, DONT_CARE