Я выполняю кастинг лучей в 3d текстуре, пока не достигну правильного значения. Я выполняю приведение лучей в кубе, и углы куба уже находятся в мировых координатах, поэтому мне не нужно умножать вершины на матрицу вида модели, чтобы получить правильную позицию.
Вершинный шейдер
world_coordinate_ = gl_Vertex;
Фрагмент шейдера
vec3 direction = (world_coordinate_.xyz - cameraPosition_);
direction = normalize(direction);
for (float k = 0.0; k < steps; k += 1.0) {
....
pos += direction*delta_step;
float thisLum = texture3D(texture3_, pos).r;
if(thisLum > surface_)
...
}
Все работает, как и ожидалось, теперь я хочу выбрать правильное значение в буфер глубины. Значение, которое теперь записывается в буфер глубины, является координатой куба. Но я хочу, чтобы значение pos
в 3d текстуре было записано.
Допустим, куб помещен на 10
от начала координат в -z
, а его размер равен 10*10*10
. Мое решение, которое не работает правильно, это:
pos *= 10;
pos.z += 10;
pos.z *= -1;
vec4 depth_vec = gl_ProjectionMatrix * vec4(pos.xyz, 1.0);
float depth = ((depth_vec.z / depth_vec.w) + 1.0) * 0.5;
gl_FragDepth = depth;