В vertex shader нет такой вещи, как ширина пространства в мире для пикселя. «Ширина» проецируется в пиксель только на данном расстоянии Z. В общем, у вас есть пирамида, проецируемая в пиксель.
Здесь вы идете:
Преобразовать два экрана-точек в НДЦ пунктов:
vec2 Screen = vec2(ScreenWidth, ScreenHeight);
vec3 Point1 = vec3(ScreenPt1/Screen * 2.0 - vec2(1.0), 1.0);
vec3 Point2 = vec3(ScreenPt2/Screen * 2.0 - vec2(1.0), 1.0);
Unproject НДЦ точек в мировой космической позиции:
vec4 R1 = vec4(Point1, 1.0);
vec4 R2 = vec4(Point2, 1.0);
R1 = Projection.GetInversed() * R1;
R1 = ModelView.GetInversed() * R1;
R1 /= R1.W;
R2 = Projection.GetInversed() * R2;
R2 = ModelView.GetInversed() * R2;
R2 /= R2.W;
Найти расстояние между R1 и R2.
В пиксельного шейдера вы можете использовать локальные производные. Посмотрите здесь:
http://www.opengl.org/sdk/docs/manglsl/xhtml/dFdx.xml
и здесь:
http://www.opengl.org/sdk/docs/manglsl/xhtml/fwidth.xml
Доступно только в пиксельный шейдер, dFdx и dFdy вернуть частную производную от выражения р х и у, соответственно. Девианты рассчитываются с использованием локальных различий. Выражения, предполагающие производные более высокого порядка, такие как dFdx (dFdx (n)), имеют неопределенные результаты, как и производные смешанного порядка, такие как dFdx (dFdy (n)). Предполагается, что выражение p является непрерывным, и поэтому выражения, оцениваемые с помощью неравномерного потока управления, могут быть неопределенными.
Эти функции доступны только в шейдере фрагментов, и я спрашиваю о вершинном шейдере, так что это не помогает мне. – atb
См. Мой обновленный ответ. –
OK, используя вашу семантику Мне нужна ширина пространства в мире «пиксельной пирамиды» на z-глубине текущей вершины в вершинном шейдере. Ваш ответ по-прежнему не помогает мне, но спасибо за информацию. – atb