Запись правильного значения в буфер глубины при использовании приведения лучей - PullRequest
4 голосов
/ 23 июня 2011

Я выполняю кастинг лучей в 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;

Ответы [ 2 ]

2 голосов
/ 08 июля 2011

Решение было:

vec4 depth_vec = ViewMatrix * gl_ProjectionMatrix * vec4(pos.xyz, 1.0);
float depth = ((depth_vec.z / depth_vec.w) + 1.0) * 0.5; 
gl_FragDepth = depth;
1 голос
/ 23 июня 2011

Одно из решений, которое вы можете попробовать - нарисовать куб, который находится прямо над кубом, который вы пытаетесь проследить. Отправьте положение куба в том же пространстве, которое вы получили из алгоритма трассировки лучей, и выполните те же преобразования, чтобы вычислить ваш «глубинный_век», только в вершинном шейдере.

Таким образом, вы можете видеть, откуда возникают ваши проблемы. Как только вы запустите эту часть преобразования, вы сможете перенести эту последовательность преобразования в свой raytracer. Если это не все исправит, то это будет только потому, что ваш алгоритм трассировки лучей не выводит позиции в том пространстве, в котором вы думаете, что оно находится.

...