文字+レンダラー+ofxBullet

スクリーンショット 2014-10-09 02.37.49

レンダラーで表示する表示オブジェクトはofNodeの継承で、下記の情報を持たせた。

・マテリアル情報(マテリアルシェーダー、テクスチャ:Diffuse,Speclar,Normal,Detail)
・メッシュ(ofMeshから生成できる拡張メッシュ )
・RigidBody(ofBulletのshapeのいずれか)

このオブジェクトをFlashみたいにaddChildでレンダラインスタンスに追加できるようにしてみた。動作はofっぽくnodeで動かせるようになったし、rigidbodyを追加すれば物理空間にぶっこめる。メッシュ形状から衝突形状が生成できるofxBulletCustomShapeを使ったらいい感じになった。

スクリーンショット 2014-10-09 02.58.37

GTX660TIだと文字たくさん出しても60fpsでてたけど、 MBAだと15fpsくらいが限界・・・。

無題

SSLR

スクリーンスペースローカルリフレクション(SSLR)実装してるんですが・・・。なんとなくでるところまではいったけど・・・。
うまくいかないわー。もーいやわー。

スクリーンショット 2014-10-07 10.28.12

 

レイトレースのfragシェーダ。だいぶ簡素化してあります。おかしいと思われる原因がありすぎて・・・ちょっと寝かせよう・・・。


vec4 RayTrace(in vec3 startP,in vec3 endP){

    vec4 startSSP = uProjectionMatrix*vec4(startP,1.0);
    startSSP.xy /= startSSP.w;
    startSSP.xy = startSSP.xy *  0.5 + 0.5; 

    vec4 endSSP = uProjectionMatrix*vec4(endP,1.0);
    endSSP.xy /= endSSP.w;
    endSSP.xy = endSSP.xy *  0.5 + 0.5; 

    vec3 vecSS = (endSSP.xyz - startSSP.xyz);
    vecSS.z=endP.z-startP.z;
    vecSS*=length(texelSize)/length(vecSS.xy);

    vec3 sampleP = vec3(0.0);
    float sampleDepth = 0.0;
    float diffZ = 0.0;
    vec4 color = vec4(0.0);

    for (int i = 1; i < 100 ; i++){
        sampleP.xy = startSSP.xy + vecSS*i;
        sampleP.z = startP.z + vecSS.z*i;

        if(sampleP.x < 0 || sampleP.x > 1 ||
	    sampleP.y < 0 || sampleP.y > 1 ||
	    sampleP.z < 0 || sampleP.z > uNearFar.y ){
	    break;
        }

        sampleDepth =linearizeDepth(texture(depthTexture, sampleP.xy).r, uNear,uFar);
        diffZ = sampleP.z - sampleDepth;
        float error = length(vecSS);

        if (diffZ>=0&& diffZ<error)
        {
            color = texture(colorBufferTexture, sampleP.xy);
            break;
        }
    }
    return color;
}