Я хочу показать туман/вид с воздуха в своем приложении. Но я хочу использовать только мировое расстояние x, y от камеры до модели, чтобы определить внешний вид.
Мне уже удалось получить подписанное z-расстояние от камеры до моделей с помощью этого расчета.
Красные объекты имеют положительное расстояние по оси z до камеры, синие — отрицательное, в отличие от этой реализации, где все значения кажутся положительными.
Вершинный шейдер:
uniform mat4 u_mvp; // Model-View-Projection-Matrix
uniform mat4 u_mv; // Model-View-Matrix
uniform vec4 u_color; // Object color
attribute vec4 a_pos; // Vertex position
varying vec4 color; // Out color
// Fog
const float density = 0.007;
const float gradient = 1.5;
void main() {
gl_Position = u_mvp * a_pos;
// Fog
float distance = -(u_mv * a_pos).z; // Direct distance from camera
// 4000 is some invented constant to bring distance to ~[-1,1].
float visibility = clamp((distance / 4000.0), 0.0, 1.0);
color = mix(vec4(1.0, 0.0, 0.0, 1.0), u_color, visibility);
if(distance < 0){
color = vec4(0.0, 0.0, 1.0, 1.0);
}
}
Фрагментный шейдер:
varying vec4 color;
void main() {
gl_FragColor = color;
}
- Почему может быть отрицательное значение z? Или это обычно?
- Как я могу рассчитать мировое расстояние x, y до камеры?
u_mv
снова является матрицей представления модели, а не матрицей проекции представления модели? - person Rabbid76   schedule 24.04.2019u_mv
отслеживает правильные значения, но она определенно отличается от других. Может забыл перевод здесь (сложно отлаживать работу других). - person User Rebo   schedule 24.04.2019