El qedl bajo la proyección ortogonal se introdujo anteriormente. De hecho, también hay un modo de perspectiva. De acuerdo con el movimiento de la posición de la cámara, las secciones lejanas y cercanas cambian constantemente, por lo que se requiere una compensación de profundidad.
Ahora mismo
float fixDepth(profundidad flotante)
{ if (PerspectiveMode == 1) { //'1/z' corrección de transformación de búfer de profundidad profundidad = (2.0 * ZM * Zm) / ((ZM + Zm) - (2.0 * profundidad - 1.0 ) * (ZM - Zm)); //eventualmente queremos que la profundidad caiga entre 0 y 1 profundidad = (profundidad - Zm) / (ZM - Zm); }
return clamp(1.0 - depth, 0.0, 1.0);
}
La sección cercana y lejana se calcula a partir de la siguiente fórmula. Se llama una vez cada vez que cambia la pose de la cámara.
osg::ref_ptrosg::Camera camera = view->getCamera();
double fovy, aspect, zNear, zFar;
camera->getProjectionMatrixAsPerspective(fovy, aspect, zNear, zFar);
mientras se actualiza el valor del shader
void ccEDL::setNearPlane(float zNear)
{ _zNear = zNear; _zNearUniform->set(_zNear); }
void ccEDL::setFarPlane(float zFar)
{ _zFar = zFar; _zLejosUniforme->set(_zLejos);
}
_zNearUniform = new osg::Uniform(“Zm”, _zNear);
_zFarUniform = new osg::Uniform(“ZM”, _zFar);