2010-03-07 119 views
2

我正在看OpenGL中的阴影映射。阴影映射中的偏差矩阵

我看到这样的代码:

// This is matrix transform every coordinate x,y,z 
// x = x* 0.5 + 0.5 
// y = y* 0.5 + 0.5 
// z = z* 0.5 + 0.5 
// Moving from unit cube [-1,1] to [0,1] 
const GLdouble bias[16] = { 
    0.5, 0.0, 0.0, 0.0, 
    0.0, 0.5, 0.0, 0.0, 
    0.0, 0.0, 0.5, 0.0, 
    0.5, 0.5, 0.5, 1.0}; 

// Grab modelview and transformation matrices 
glGetDoublev(GL_MODELVIEW_MATRIX, modelView); 
glGetDoublev(GL_PROJECTION_MATRIX, projection); 


glMatrixMode(GL_TEXTURE); 
glActiveTextureARB(GL_TEXTURE7); 

glLoadIdentity(); 
glLoadMatrixd(bias); 

// concatating all matrice into one. 
glMultMatrixd (projection); 
glMultMatrixd (modelView); 

// Go back to normal matrix mode 
glMatrixMode(GL_MODELVIEW); 

现在,如果我撕裂了偏置矩阵。该代码不起作用。搜索其他阴影映射代码,我看到相同的偏差矩阵,没有任何解释。为什么我要这个偏差将x,y,z映射到0.5 * x + 0.5,0.5 * y + y,...?

谢谢!

回答

5

当您使用标准模型视图/投影矩阵来转换视锥内的顶点时,得到的结果是一旦w分割完成后的顶点位于[-1:1] x [-1:1 ]×[-1:1]立方体。您希望纹理坐标位于[0:1] x [0:1]范围内,因此可以重新映射x和y。对于Z来说,这是一样的事情,假设你的DepthRange是[0:1],这是默认设置。