1

頂点シェーダーに線があります

gl_Position  = gl_ModelViewProjectionMatrix * vertex;

次のように、シェーダーなしで同じ計算を行う必要があります。

float vertex[4];
float modelviewProjection[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelviewProjection);
glMatrixMode(GL_PROJECTION_MATRIX);
glMultMatrixf(modelviewProjection);


for ( counter = 0; counter < numPoints; counter++ )
{

    vertex[0] = *vertexPointer + randomAdvance(timeAlive) + sin(ParticleTime); 
    vertex[1] = *( vertexPointer + 1 ) + randomAdvance(timeAlive) + timeAlive * 0.6f;
    vertex[2] = *( vertexPointer + 2 );
    glPushMatrix();
    glMultMatrixf(vertex);

    *vertexPointer = vertex[0];
    *( vertexPointer + 1 ) = vertex[1];
    *( vertexPointer + 2 ) = vertex[2];
    vertexPointer += 3;
    glPopMatrix();

}
4

1 に答える 1

1

適切なベクトル/行列ライブラリがない場合は、GLMを調べてください(大騒ぎせずにそのようなことを行うことができます)。

手動で実行する場合、変換されたベクトルのコンポーネントは、行列のそれぞれの行と変換されていないベクトルの内積です。これは、ベクトルが1つの列を持つ行列と見なすことができるためです(次に、行列の乗算の規則を適用するだけです)。

したがって、OpenGLメモリレイアウトを想定すると、次のようになります
。x = x * m [0] + y * m [4] + z * m [8] + w * m [12]、y = x * m [1] + y * m [5] + z * m [9] + w *m[13]など。

于 2011-04-10T12:33:05.347 に答える