Делаю шейдер с буфером через graphics.Blit.
У стандартного шейдера (допустим particles/blended) буфер глубины считается как матрица MVP * vertex.
Попробовал просчитать матрицу в c# и передавать в шейдер. Всё корректно отрисовывается. То есть UNITY_MATRIX_MVP я передаю из скрипта.
Теперь проблема. Блит работает с квадом 0-1 растянутым на весь экран. (а не с мешем который может быть где-то в пространстве). Поэтому встроенный UNITY_MATRIX_MVP и буфер глубины работают только если меш с проецируемой текстурой находятся ровно на весь экран. Сместив меш, буфер глубины всё равно считается для экрана, а не для меша.
Подумал что можно вручную передать UNITY_MATRIX_MVP из скрипта, но считать матрицу не для экранного квада, а для меша, на котором я рисую текстуру. И это тоже не работает.
Юзаю такой расчёт MVP матрицы. Скрипт приаттачен на меш
Синтаксис:
Используется csharp
bool d3d = SystemInfo.graphicsDeviceVersion.IndexOf("Direct3D") > -1;
Matrix4x4 M = transform.localToWorldMatrix;
Matrix4x4 V = camera.worldToCameraMatrix;
Matrix4x4 P = camera.projectionMatrix;
if (d3d) {
// Invert Y for rendering to a render texture
for (int i = 0; i < 4; i++) {
p[1,i] = -p[1,i];
}
// Scale and bias from OpenGL -> D3D depth range
for (int i = 0; i < 4; i++) {
p[2,i] = p[2,i]*0.5f + p[3,i]*0.5f;
}
}
Matrix4x4 MVP = P*V*M;
Matrix4x4 M = transform.localToWorldMatrix;
Matrix4x4 V = camera.worldToCameraMatrix;
Matrix4x4 P = camera.projectionMatrix;
if (d3d) {
// Invert Y for rendering to a render texture
for (int i = 0; i < 4; i++) {
p[1,i] = -p[1,i];
}
// Scale and bias from OpenGL -> D3D depth range
for (int i = 0; i < 4; i++) {
p[2,i] = p[2,i]*0.5f + p[3,i]*0.5f;
}
}
Matrix4x4 MVP = P*V*M;
В чём может быть проблема? Как в блит расчитать буфер глубины не в экранных позициях?