LoginSignup
15
17

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-05-25

概要

日本語サイトは情報が古く、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 符号付き2進数
ubyte 8 符号なし2進数
char 8 文字列用の文字
short 16 符号付き2進数
ushort 16 符号なし2進数
int 32 符号付き2進数
uint 32 符号なし2進数
float 32 浮動小数点数
clampf 32 0〜1に制限された浮動小数点数
fixed 32 符号付き固定小数点数
sizei 32 0以上2進数によるサイズ
enum 32 2新数値の列挙
bitfield 32 ビットフィールド
intptr ptrbits 符号付き2進数
sizeiptr ptrbits 0以上の2進数によるサイズ

頂点と頂点配列

頂点

頂点のAttribute変数を設定

void VertexAttrib{1234}{f}(uint index, T values);
void VertexAttrib{1234}{f}v(uint index, T values);

頂点配列

頂点Atributeの位置の指定

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配列を使う/使わない

void EnableVertexAttribArray(uint index);
void DisableVertexAttribArray(uint index);
  • index: [0, MAX_VERTEX_ATTRIBS - 1]

インデックスなし頂点の描画

void DrawArrays(enum mode, int first, sizei count);

インデックスあり頂点の描画

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

シェーダーとプログラム

シェーダーオブジェクト

シェーダーの作成

uint CreateShader(enum type);
  • type: VERTEX_SHADER, FRAGMENT_SHADER

シェーダーのソースの指定

void ShaderSource(uint shader, sizei count, const char **string, const int *length);

シェーダーのコンパイル

void CompileShader(uint shader);

シェーダーの解放

void ReleaseShaderCompiler(void);

シェーダーの削除

void DeleteShader(uint shader);

シェーダーバイナリのロード

void ShaderBinary(sizei count, const uint *shaders, enum binaryformat, const void *binary, sizei length);

プログラムオブジェクト

シェーダープログラムの作成

uint CreateProgram(void);

シェーダーのアタッチ

void AttachShader(uint program, uint shader);

シェーダーのデタッチ

void DetachShader(uint program, uint shader);

シェーダーオブジェクトのリンク

void LinkProgram(uint program);

使用するシェーダーの指定

void UseProgram(uint program);

シェーダープログラムの削除

void DeleteProgram(uint program);

Attrbute変数とUniform変数

頂点Attrbute変数

アクティブなAttribute変数の取得

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変数の位置の取得

int GetAttribLocation(uint program, const char *name);

Attribute変数と結合

void BindAttribLocation(uint program, uint index, const char *name);

Uniform変数

Uniform変数の位置の取得

int GetUniformLocation(uint program, const char *name);

アクティブなUniform変数の取得

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変数に値を設定

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

シェーダーのチェック

シェーダーの妥当性チェック

void ValidateProgram(uint program);

シェーダーへの問い合わせ

シェーダーがあるか?

boolean IsShader(uint shader);

シェーダーの値の取得

void GetShaderiv(uint shader, enum pname, int *params);
  • pname: SHADER_TYPE, DELETE_STATUS, COMPILE_STATUS, INFO_LOG_LENGTH, SHADER_SOURCE_LENGTH

アタッチされたシェーダーの取得

void GetAttachedShaders(uint program, sizei maxCount, sizei *count, uint *shaders);

シェーダーのログを取得

void GetShaderInfoLog(uint shader, sizei bufSize, sizei *length, char *infoLog);

シェーダーのソースを取得

void GetShaderSource(uint shader, sizei bufSize, sizei *length, char *source);

シェーダーの精度形式を取得

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変数の値の取得

void GetVertexAttribfv(uint index, enum pname, float *params);
  • pname: CURRENT_VERTEX_ATTRIB , VERTEX_ATTRIB_ARRAY_x (x は BUFFER_BINDING, ENABLED, SIZE, STRIDE, TYPE, NORMALIZED)
void GetVertexAttribiv(uint index, enum pname, int *params);
  • pname: CURRENT_VERTEX_ATTRIB , VERTEX_ATTRIB_ARRAY_x (x は BUFFER_BINDING, ENABLED, SIZE, STRIDE, TYPE, NORMALIZED)
void GetVertexAttribPointerv(uint index, enum pname, void **pointer);
  • pname: VERTEX_ATTRIB_ARRAY_POINTER

Uniform変数の値の取得

void GetUniformfv(uint program, int location, float *params)
void GetUniformiv(uint program, int location, int *params)

プログラムへの問い合わせ

シェーダープログラムがあるか?

boolean IsProgram(uint program);

シェーダープログラムの取得

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);

フラグメント前の操作

シザーテスト

有効/無効

Enable/Disable(SCISSOR_TEST)
  • シザー範囲の指定 void Scissor(int left, int bottom, sizei width, sizei height );

マルチサンプリングフラグメント操作

有効/無効

Enable/Disable(cap)
  • cap: SAMPLE_ALPHA_TO_COVERAGE, SAMPLE_COVERAGE

サンプリング範囲の指定

void SampleCoverage(clampf value, boolean invert);

ステンシルテスト

有効/無効

Enable/Disable(STENCIL_TEST)

ステンシル関数の指定

void StencilFunc(enum func, int ref, uint mask);

ステンシル関数の個別指定

void StencilFuncSeparate(enum face, enum func, int ref, uint mask);

ステンシル操作の指定

void StencilOp(enum sfail, enum dpfail, enum dppass);

ステンシル操作の個別指定

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

深度テスト

有効/無効

Enable/Disable(DEPTH_TEST)

深度テスト関数の指定

void DepthFunc(enum func);
  • func: NEVER, ALWAYS, LESS, LEQUAL, EQUAL, GREATER, GEQUAL, NOTEQUAL

ブレンディング

有効/無効

Enable/Disable(BLEND) (applies to all draw buffers)

ブレンディング式の指定

void BlendEquation(enum mode);

ブレンディング式の個別指定

void BlendEquationSeparate(enum modeRGB, enum modeAlpha);
  • mode, modeRGB, modeAlpha: FUNC_ADD, FUNC_SUBTRACT, FUNC_REVERSE_SUBTRACT

ブレンディング関数の個別指定

void BlendFuncSeparate(enum srcRGB, enum dstRGB, enum srcAlpha, enum dstAlpha);

ブレンディング関数の指定

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
void BlendColor(clampf red, clampf green, clampf blue, clampf alpha);

ディザ

有効/無効

Enable/Disable(DITHER)

フレームバッファ操作

色マスクの指定

void ColorMask(boolean r, boolean g, boolean b, boolean a);

深度マスクの指定

void DepthMask(boolean mask);

ステンシルマスクの指定

void StencilMask(uint mask);

ステンシルマスクの個別指定

void StencilMaskSeparate(enum face, uint mask);
  • face: FRONT, BACK, FRONT_AND_BACK

バッファのクリア

void Clear(bitfield buf);
  • buf: COLOR_BUFFER_BIT, DEPTH_BUFFER_BIT, STENCIL_BUFFER_BIT のビットごとのOR

色バッファのクリア

void ClearColor(clampf r, clampf g, clampf b, clampf a);

深度バッファのクリア

void ClearDepthf(clampf d);

ステンシルバッファのクリア

void ClearStencil(int s);

フレームバッファの結合と管理

フレームバッファの結合

void BindFramebuffer(enum target, uint framebuffer);
  • target: FRAMEBUFFER

フレームバッファの削除

void DeleteFramebuffers(sizei n, uint *framebuffers);

フレームバッファの取得

void GenFramebuffers(sizei n, uint *framebuffers);

レンダリングバッファオブジェクト

レンダリングバッファの結合

void BindRenderbuffer(enum target, uint renderbuffer);
  • target: RENDERBUFFER

レンダリングバッファの削除

void DeleteRenderbuffers(sizei n, const uint *renderbuffers);

レンダリングバッファ配列の作成

void GenRenderbuffers(sizei n, uint *renderbuffers);

レンダリングバッファストレージの指定

void RenderbufferStorage(enum target, enum internalformat, sizei width, sizei height);
  • target: RENDERBUFFER
  • internalformat: DEPTH_COMPONENT16, RGBA4, RGB5_A1, RGB565, STENCIL_INDEX8

レンダリングバッファ画像のフレームバッファへのアタッチ

void FramebufferRenderbuffer(enum target, enum attachment, enum renderbuffertarget, uint renderbuffer);
  • target: FRAMEBUFFER
  • attachment: COLOR_ATTACHMENT0, DEPTH_ATTACHMENT, STENCIL_ATTACHMENT
  • renderbuffertarget: RENDERBUFFER

テクスチャ画像のフレームバッファへのアタッチ

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

フレームバッファをチェック

enum CheckFramebufferStatus(enum target);
  • target: FRAMEBUFFER
  • returns: FRAMEBUFFER_COMPLETE or a constant indicating which value violates framebuffer completeness

フレームバッファオブジェクトへの問い合わせ

フレームバッファがあるか?

boolean IsFramebuffer(uint framebuffer);

フレームバッファのパラメータの取得

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

レンダリングバッファへの問い合わせ

レンダリングバッファがあるか?

boolean IsRenderbuffer(uint renderbuffer);

レンダリングバッファのパラメータの取得

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)

その他

単純な問い合わせ

void GetBooleanv(enum value, boolean *data);
void GetIntegerv(enum value, int *data);
void GetFloatv(enum value, float *data);
boolean IsEnabled(enum value);

ポインタと文字列での問い合わせ

ubyte *GetString(enum name); 
  • name: VENDOR, RENDERER, VERSION, SHADING_LANGUAGE_VERSION, EXTENSIONS

バッファフラッシュと終了

void Flush(void);
void Finish(void);

ヒント

void Hint(enum target, enum hint);
  • target: GENERATE_MIPMAP_HINT
  • hint: FASTEST, NICEST, DONT_CARE
15
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
17