LoginSignup
11
5

More than 5 years have passed since last update.

ofShader.cppのデフォルト・アトリービュートメモ

Last updated at Posted at 2017-04-28

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;
}
11
5
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
11
5