我在顶点着色器中有一行
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();
}
答案 0 :(得分: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]等。