LoginSignup
7
9

More than 5 years have passed since last update.

OpenGLの使い方:シェーダ編

Posted at

OpenGLの使い方:シェーダ編

目標

シェーダオブジェクトの操作を取り上げます.プログラムオブジェクトはここでは扱いません.

シェーダオブジェクト

シェーダオブジェクトは一般のOpenGLオブジェクトとは幾分か異なります.
glCreateShader で生成します. type は取り扱うシェーダステージに対応する値を渡します. glDeleteShader で破棄します.なお,バインドに相当するものはありません.

オブジェクト
// 生成
GLenum type;
GLuint shader = glCreateShader(type);

// 破棄
glDeleteShader(shader);

コンパイル

まず glShaderSource でオブジェクトへシェーダコードを渡します. source はシェーダコードを表す文字列へのポインタを渡します. length はシェーダコードを表す文字列の長さを渡します. source がヌル終端文字列であれば,第4引数に NULL を渡すことができます.
渡したシェーダコードは glCompileShader でコンパイルします.

コンパイル
// ソースを渡す
const GLchar* source;
GLint length;
glShaderSource(shader, 1, &source, &length);

// コンパイル
glCompileShader(shader);

エラーチェック

コンパイルの成否は GL_COMPILE_STATUS パラメータで確認します.コンパイルに失敗した場合は,何かしらのログを受け取ることができます.
GL_INFO_LOG_LENGTH パラメータで,ログを受け取るのに必要なバッファサイズを確認できます. glGetShaderInfoLog でログを受け取ります. max_length はログを受け取るためのバッファのサイズを渡します. length には受け取るログの文字列の長さが返ります. log にはログを受け取るためのバッファへのポインタを渡します.

エラーチェック
// 成否を確認
GLint result;
glGetShaderiv(shader, GL_COMPILE_STATUS, &result);

// ログを取得
if (result == GL_FALSE) {
  // サイズを取得
  GLint log_length;
  glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_length);

  // 文字列を取得
  GLsizei max_length;
  GLsizei length;
  GLchar log[max_length];
  glGetShaderInfoLog(shader, max_length, &length, log);
}

メモ

(特になし)

7
9
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
7
9