OpenframeworksでGLSLの3.0以上を使うとき、レイアウトをマジで毎回忘れるのでメモ
(0.9.8@visualStudio 2015で確認)
0 = POSITION_ATTRIBUTE
1 = COLOR_ATTRIBUTE
2 = NORMAL_ATTRIBUTE
3 = TEXCOORD_ATTRIBUTE
上記の順番で取り込まれるので、うまくLayoutを確認してみること。
ofShader.cppで下記のような書き方されてる。
ofShader.cpp
bool ofShader::bindDefaults() const{
if(shaders.empty()) {
ofLogError("ofShader") << "bindDefaults(): trying to link GLSL program, but no shaders created yet";
return false;
} else {
bindAttribute(ofShader::POSITION_ATTRIBUTE,::POSITION_ATTRIBUTE);
bindAttribute(ofShader::COLOR_ATTRIBUTE,::COLOR_ATTRIBUTE);
bindAttribute(ofShader::NORMAL_ATTRIBUTE,::NORMAL_ATTRIBUTE);
bindAttribute(ofShader::TEXCOORD_ATTRIBUTE,::TEXCOORD_ATTRIBUTE);
return true;
}
}
テッセレーションとかは0.9.8では未実装の模様。
使いたい場合は自分で書くこと。
ofShader.cpp
string ofShader::nameForType(GLenum type){
switch(type) {
case GL_VERTEX_SHADER: return "GL_VERTEX_SHADER";
case GL_FRAGMENT_SHADER: return "GL_FRAGMENT_SHADER";
#ifndef TARGET_OPENGLES
case GL_GEOMETRY_SHADER_EXT: return "GL_GEOMETRY_SHADER_EXT";
#ifdef glDispatchCompute
case GL_COMPUTE_SHADER: return "GL_COMPUTE_SHADER";
#endif
#endif
default: return "UNKNOWN SHADER TYPE";
}
}
ofGLProgrammableRenderer.cpp
の中にマトリックス関係。
ダウンロードしてきたコードが動かないとかの時は、先頭文字が大文字になってるとかありがち。
ofGLProgrammableRenderer.cpp
static const string VIEW_MATRIX_UNIFORM="viewMatrix";
static const string MODELVIEW_MATRIX_UNIFORM="modelViewMatrix";
static const string PROJECTION_MATRIX_UNIFORM="projectionMatrix";
static const string MODELVIEW_PROJECTION_MATRIX_UNIFORM="modelViewProjectionMatrix";
static const string TEXTURE_MATRIX_UNIFORM="textureMatrix";
static const string COLOR_UNIFORM="globalColor";
ofShaderとは関係ないけどブレンドモードの中身も同じcpp内に記述してある。うっかり忘れがちなのでメモ。
ofGLProgrammableRenderer.cpp
void ofGLProgrammableRenderer::setBlendMode(ofBlendMode blendMode){
switch (blendMode){
case OF_BLENDMODE_DISABLED:
glDisable(GL_BLEND);
break;
case OF_BLENDMODE_ALPHA:
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
break;
case OF_BLENDMODE_ADD:
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
break;
case OF_BLENDMODE_MULTIPLY:
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA /* GL_ZERO or GL_ONE_MINUS_SRC_ALPHA */);
break;
case OF_BLENDMODE_SCREEN:
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE);
break;
case OF_BLENDMODE_SUBTRACT:
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
break;
default:
break;
}
currentStyle.blendingMode = blendMode;
}