为了防止以后搞糊涂,今天写了代码证实了opengl的矩阵的分布情况,
书上说opengl是列向量,在我看来还是把他当成行向量来看吧,因为从opengl的矩阵各个分量的分布情况看,还是看成行向量好。
只不过opengl在做矩阵相乘的时候,相当于把矩阵转置之后再相乘,
看下面这行代码:
glTranslatef(1.0f,1.0f,1.0f);
glRotatef(30.0f,0.0f,1.0f.0.0f);
这就是为什么上面两行代码的效果是先进行旋转再进行平移了。
ModelView矩阵:
opengl的modelview矩阵是这样的:
你定义一个float m[16];
x m[0] m[1] m[2] m[3]
y m[4] m[5] m[6] m[7]
z m[8] m[9] m[10] m[11]
平移 m[12] m[13] m[14] m[15]
0,1,2是旋转的X轴,4,5,6是旋转的Y轴,8,9,10是旋转的Z轴
这时把你的顶点看成是行向量,顶点右乘矩阵。
可以把这个矩阵直接赋值给opengl的modelview矩阵:glLoadMatrix(m);
透视投影矩阵
如果float m[16].是这样来布局的:
M[0] m[4] m[8] m[12]
M[1] m[5] m[9] m[13]
M[2] m[6] m[10] m[14]
M[3] m[7] m[11] m[15]
这个矩阵跟上面的矩阵一一对应。
然后就可以把这个矩阵复制给projection矩阵了:glLoadMatrix(m);
另外我发现一个现象,在顶点shader里面这样计算一个顶点:
vec4 position = gl_ModelViewProjection* vertex;
position.x/position.w在-1.0-1.0之间
position.y/position.w在-1.0-1.0之间
但是position.z/position.w的值非常接近1.0,本来我以为这个值应该均匀分布于-1.0-1.0之间的
但是,大多数顶点的这个值都非常接近1.0,详情请看我转载的另外一篇文章,《opengl glsl 深度计算》