/* ** 単純な陰影付けを行うシェーダ */ #include "GgSimpleShader.h" // コンストラクタ gg::GgSimpleShader::GgSimpleShader( const GLchar *vert, const GLchar *frag, const GLchar *pv, const GLchar *nv, const GLchar *mw, const GLchar *mc, const GLchar *mg, const GLchar *ldiff, const GLchar *lspec, const GLchar *lamb, const GLchar *lpos, const GLchar *kdiff, const GLchar *kspec, const GLchar *kamb, const GLchar *kshi ) : GgShader(vert, frag) { // 属性データの初期化 light = 0; material = 0; // attribute 変数の場所の取得 pvLoc = glGetAttribLocation(getProgram(), pv); nvLoc = glGetAttribLocation(getProgram(), nv); // 座標変換の uniform 変数の場所の取得 mwLoc = glGetUniformLocation(getProgram(), mw); mcLoc = glGetUniformLocation(getProgram(), mc); mgLoc = glGetUniformLocation(getProgram(), mg); // 光源パラメータの uniform 変数の場所の取得 ldiffLoc = glGetUniformLocation(getProgram(), ldiff); lspecLoc = glGetUniformLocation(getProgram(), lspec); lambLoc = glGetUniformLocation(getProgram(), lamb); lposLoc = glGetUniformLocation(getProgram(), lpos); // 材質パラメータの uniform 変数の場所の取得 kdiffLoc = glGetUniformLocation(getProgram(), kdiff); kspecLoc = glGetUniformLocation(getProgram(), kspec); kambLoc = glGetUniformLocation(getProgram(), kamb); kshiLoc = glGetUniformLocation(getProgram(), kshi); } // シェーダプログラムの適用 void gg::GgSimpleShader::use(GgMatrix &projection, GgMatrix &modelview) const { // プログラムオブジェクトの指定 glUseProgram(getProgram()); // 変換行列の設定 glUniformMatrix4fv(mwLoc, 1, GL_FALSE, modelview.get()); glUniformMatrix4fv(mcLoc, 1, GL_FALSE, (projection * modelview).get()); glUniformMatrix4fv(mgLoc, 1, GL_FALSE, modelview.normal().get()); // 光源パラメータの設定 glUniform4fv(ldiffLoc, 1, light->getDiffuse()); glUniform4fv(lspecLoc, 1, light->getSpecular()); glUniform4fv(lambLoc, 1, light->getAmbient()); glUniform4fv(lposLoc, 1, light->getPosition()); // 材質パラメータの設定 glUniform4fv(kdiffLoc, 1, material->getDiffuse()); glUniform4fv(kspecLoc, 1, material->getSpecular()); glUniform4fv(kambLoc, 1, material->getAmbient()); glUniform1f(kshiLoc, material->getShininess()); }