2

私はopengl es 2.0プログラミングガイドからopengl esを学んでいます。爆発のように見える粒子効果があります。mat4 プロジェクション マトリックスを頂点シェーダーに追加して、サンプル コードを拡張しようとしています。シェーダーはコンパイルして動作しますが、プロジェクションを考慮して配置する効果を得るのに問題があります。私が持っているコードは次のとおりです

const char* ParticleExplosionVertexShader = STRINGIFY (

uniform float u_time;
uniform vec3 u_centerPosition;
uniform mat4 Projection;
attribute float a_lifetime;
attribute vec3 a_startPosition;
attribute vec3 a_endPosition;
varying float v_lifetime;

void main()
{
    if ( u_time <= a_lifetime )
    {
        gl_Position.xyz = a_startPosition + (u_time * a_endPosition);
        gl_Position.xyz += u_centerPosition;
        gl_Position.w = 1.0;
    }
    else
        gl_Position = vec4( -1000, -1000, 0, 0 );
    v_lifetime = 1.0 - ( u_time / a_lifetime );
    v_lifetime = clamp ( v_lifetime, 0.0, 1.0 );
    gl_PointSize = ( v_lifetime * v_lifetime ) * 40.0;
}

);

エラーなしで行にプロジェクションを追加できますが、残念ながら、そのコードは d=screen のオブジェクトをその寿命の終わりに配置しているため、実際には必要ありません。

gl_Position = Projection * vec4( -1000, -1000, 0, 0 );

ラインも変えてみました

gl_Position.xyz += u_centerPosition;

gl_Position += Projection * u_centerPosition;

しかし、私はそれを望みどおりに配置することができませんでした

私は何か間違ったことをしていますか?それとも、誰かがポイントスプライトでやるべきことではないなど、本に射影行列がなかった理由はありますか?

私が調べるべきことへの助けや指針をいただければ幸いです

ありがとう

編集:私からさらに情報が必要な場合はお知らせください

4

1 に答える 1

0

通常のジオメトリと同様に、gl_Position全体にmodelview-projectionマトリックスを掛けるのはどうですか?

また、おそらくgl_PointSizeを計算する行を変更する必要があります。たとえば、gl_Position.wで除算してみてください(modelview-projectionで乗算した後)。そうしないと、スプライトはすべて同じサイズになります(これはあなたがしようとしていることです)修理?)。

于 2012-01-16T08:51:38.043 に答える