Bling Phongシェーディングのコード

本物のページはこちら→bling-phong-shading

Included page "bling-phong-shading" does not exist (create it now)

blinn-phong.png
Blinn-Phongのモデルはエネルギーを保持しない、と言われている。

頂点シェーダ

varying vec3 v_lightvec;
varying vec3 v_cam;
varying vec3 v_normal;
void main(){
    vec4 pos = gl_ModelViewMatrix * gl_Vertex;  // 頂点位置
    gl_Position =gl_ProjectionMatrix *pos;
    v_cam =normalize(gl_Position.xyz);          // 視線ベクトル
    v_normal=normalize(gl_NormalMatrix *gl_Normal);//gl_NormalMatrixをかけ算しないと、光の位置がオブジェクトについてくるように見える
    v_lightvec=normalize(gl_LightSource[0].position.xyz -pos);
}

フラグメントシェーダ

vec3 shading(vec3 _normal,vec3 _viewvec,vec3 _lightpos){
 
    float diffuse_intensity=max(dot(_lightpos,_normal),0);//光源の拡散反射強度
    vec3 diffuse=gl_FrontLightProduct[0].diffuse*diffuse_intensity;
 
    if(diffuse_intensity<=0){//もし光の方向ベクトル・法線の内積が0以下だったら鏡面反射は発生しない。
        return gl_FrontLightProduct[0].ambient+diffuse;
    }else{//光の方向ベクトル・法線の内積が0より大きい場合だけ鏡面反射が発生する
        vec3 reflection = normalize(_lightpos+_viewvec);//正反射ベクトル ハーフベクトルとも呼ばれている
        float specular_intensity=pow(max(dot(reflection,_normal),0),gl_FrontMaterial.shininess);
        vec3 specular=gl_FrontLightProduct[0].specular*specular_intensity;
        return gl_FrontLightProduct[0].ambient+diffuse+specular;
    }
}
varying vec3 v_normal;
varying vec3 v_cam;
varying vec3 v_lightvec;//モデルビュー変換する必要があるのでvarying変数にする
    void main() {  
        //vec3 v_lightpos=vec3(0.5,0.5,2.4);
        gl_FragColor=vec4(shading(v_normal,v_cam,v_lightvec),1.0);
 
    }

cpp側のコード

    void display(){
        //描画
        glClearColor(0,0,0,0);
        //glClearColor(0.2,0.2,0.2,1.0);
        //glClearColor(1.0,1.0,1.0,1.0);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glMatrixMode(GL_MODELVIEW);
 
        glPushMatrix();
 
        glLoadIdentity();
 
        gluLookAt(m_world_eye_pos.x, m_world_eye_pos.y, m_zoom,0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
        GLfloat ambient[]={0.2,0.2,0.2,1.0};
        GLfloat position[]={0.5,0.5,2.4,1.0};
        GLfloat mat_diffuse[]={0.6,0.8,0.0,1.0};
        GLfloat mat_specular[]={1.0,1.0,1.0,1.0};
        GLfloat mat_shiness[]={50.0};
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);
        //glLightfv(GL_LIGHT0,GL_AMBIENT,ambient);
        glLightfv(GL_LIGHT0,GL_POSITION,position);
        glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
        glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
        glMaterialfv(GL_FRONT,GL_SHININESS,mat_shiness);
 
        glTranslated(m_translate.x,m_translate.y,0.0);/* 平行移動(奥行き方向)   */
        m_target_quaternion.toMat4(const_cast<float*>(m_rotation_matrix.m));
        glMultMatrixf(m_rotation_matrix.m);//クォータニオンによる回転
        glEnable(GL_LINE_SMOOTH);
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
        glHint(GL_LINE_SMOOTH_HINT,GL_DONT_CARE);
 
        glLineWidth(2.0);
        glColor4ub(153,204,0,200);
        //glColor4f(0.0,0.0,0.0,1.0);
        //glutWireSphere(1.0,20,20);
        glUseProgram(m_glsl);
        glutSolidTeapot(1.0);
        // glutWireCube(1.0);
        //glUseProgram(0);
        glDisable(GL_BLEND);
        glDisable(GL_LINE_SMOOTH);
        glPopMatrix();
 
    }//for display

サポートサイト Wikidot.com ambientdiffuse