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);
}
メモ
(特になし)