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(它可以毫不费力地做那种事情)。

如果要手动进行,则变换向量的分量是矩阵中各行与未变换向量的点积。那是因为一个向量可以被看作是一个具有一列的矩阵(然后只需应用矩阵乘法的规则)。

因此,假设 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 回答