glsl プリコンパイル済みシェーダーバイナリーの読み書き | puarts.com
映像・CG・画像処理関連の技術情報、個人作品の創作記録、メモなど
Category

glsl プリコンパイル済みシェーダーバイナリーの読み書き

公開日: 2018/01/27 | カテゴリ: Note | タグ: OpenGL

プリコンパイル済みの glsl シェーダーバイナリーを読み書きする方法を一度覚えて、忘れてしまったので備忘用にメモしておきます。参照サイトの丸コピですが。

コンパイル済み glsl シェーダーバイナリーの保存

GLuint progId = glCreateProgram();

...
...
glProgramParameteri(progId, PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE);
glLinkProgram(progId);

...
...

#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
#define GL_PROGRAM_BINARY_FORMATS 0x87FF
GLint formats = 0;
glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &formats);
GLint *binaryFormats = new GLint[formats];
glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, binaryFormats);
#define GL_PROGRAM_BINARY_LENGTH 0x8741
GLint len=0;
glGetProgramiv(progId, GL_PROGRAM_BINARY_LENGTH, &len);
u8* binary = new u8[len];
GLenum *binaryFormats = 0;
glGetProgramBinary(progId, len, NULL, (GLenum*)binaryFormats, binary);
FILE* fp = fopen(shader.bin, "wb");
fwrite(binary, len, 1, fp);
fclose(fp);
delete [] binary;

プリコンパイル済み glsl シェーダーバイナリーの読み込み

FILE* fp = fopen(shader.bin, "rb");
fseek(fp, 0, SEEK_END);
GLint len = (GLint)ftell(fp);
u8* binary = new u8[len];
fseek(fp, 0, SEEK_SET);
fread(binary, len, 1, fp);
fclose(fp);

GLint formats = 0;
glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &formats)
GLenum *binaryFormats = new [formats];
glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, binaryFormats);

GLuint progId = glCreateProgram();
glProgramBinary(progId, binaryFormats, binary, len);

delete [] binary;

GLint success;
glGetProgramiv(progId, GL_LINK_STATUS, &success);
if (!success)
{
 // Loading failed...
}

参考リンク
http://www.geeks3d.com/20100727/opengl-4-1-allows-the-use-of-binary-shaders/


  このエントリーをはてなブックマークに追加  

にほんブログ村 デザインブログ グラフィックアートへ
Links

参考になりそうなブログやサイトを見つけたら勝手にリンクを貼らせてもらっています。
リンク削除を希望の場合はお手数ですがメールにてご一報下さい。
Ke-Sen Huang's Home Page        Disney Research        VIDEO COPILOT        AbandonedArt.org
ryoji ikeda        チームラボ        トルク with AR三兄弟        DAITO MANABE

Copyright(C)2006-2018 wsp All Rights Reserved