и еще вопрос вдогонку: как мне отрисовывать фонарик перед камерой, так чтобы он не загораживался другими объектами - кароч поверх всех? вроде бы ответ прост: нарисуй все объекты, затри буфер глубины, и нарисуй фонарик. но нифига! буфер глубины у меня используется в дефереде для оптимизаций буфером трафарета. поэтому это не вариант. форвард рендер у меня в зачаточном состоянии - рисует только полупрозрачные объекты и без освещения. я уже перепробовал рисовать фонарик после всех с отключенной записью в буфер глубины, с отключенным буфером вообще. получается шлак - полигоны перемешиваются в кашу - один на другой накладываются. че делать?
в коде дума3 нашел интересный код
/*
===============
RB_EnterModelDepthHack
===============
*/
void RB_EnterModelDepthHack( float depth ) {
qglDepthRange( 0.0f, 1.0f );
float matrix[16];
memcpy( matrix, backEnd.viewDef->projectionMatrix, sizeof( matrix ) );
matrix[14] -= depth;
qglMatrixMode(GL_PROJECTION);
qglLoadMatrixf( matrix );
qglMatrixMode(GL_MODELVIEW);
}
/*
===============
RB_LeaveDepthHack
===============
*/
void RB_LeaveDepthHack() {
qglDepthRange( 0, 1 );
qglMatrixMode(GL_PROJECTION);
qglLoadMatrixf( backEnd.viewDef->projectionMatrix );
qglMatrixMode(GL_MODELVIEW);
}
может он как-то поможет?
update. перевел его на dx. и он работает, это классно.
вот мой вариант:
void Camera::EnterDepthHack( float depth )
{
if( !inDepthHack ) {
depthHackMatrix = projection;
}
inDepthHack = true;
projection._43 -= depth;
CalculateInverseViewProjection();
}
void Camera::LeaveDepthHack()
{
inDepthHack = false;
projection = depthHackMatrix;
CalculateInverseViewProjection();
}
при рендере фонарика ставлю EnterDepthHack( 0.1 ) и все! он рендерится поверх всего и не "проваливается" ни в какие объекты.