MrShoor
>Но почему без фрагментного то
потому что не понимаю
если примитив для линий два триугольника - то концы широкой линии будут иметь перспективное искажение, которое нивилируем проходом в фрагментном шейдере, считая расстояние до линии на каждом пикселе?
естественно любой лишний расчёт желателен к устранению, поэтому и говорю что считать скрин-спейс толщину линии в фрагментном неподходит
логично же что правильно посчитать 4 вершины в вершинном - намного эффективнее чем считать толшину линии для кадого пикселя двух трианглов в фрагментном
конечно расчёт цвета и затухания будет происходить в фрагментном, если понадобится - но толщина же должна быть задана примитивом в вершинном - чтобы меньше пикселей обрабатывать в фрагментном
slax
> если примитив для линий два триугольника - то концы широкой линии будут иметь
> перспективное искажение
В вершинном шейдере можно все сделать без песпективного искажения. Достаточно "двигать" вершины после умножения на матрицу проекции.
MrShoor
> Достаточно "двигать" вершины после умножения на матрицу проекции.
какраз это у меня и не получается
получается что двигая вершины, для конца линии, который за экраном после проекции 3д линии, видна большая толщина там где линия пересекает экран по сравнению со вторым видимым концом линии
хотя вектор тощины прибавляю после перевода вершин в 2д
кода оба конца на экране, толщина линии как надо - одинаковая
vec3 ToWindow(vec4 vert, vec4 viewport) { vec3 dvert = vert.xyz / vert.w; vec2 xypos = ( dvert.xy + vec2( 1.0, 1.0)) * 0.5 * viewport.zw; return vec3( xypos, dvert.z * 0.5 + 0.5); } void main( ){ vec4 viewport=vec4( 0,0,800,600); vec4 vert0 = matrix * vec4( position.xyz,1.0f); vec4 vert1 = matrix * vec4( position2.xyz,1.0f); vec3 win0 = ToWindow( vert0, viewport); vec3 win1 = ToWindow( vert1, viewport); vec2 tangent = win1.xy - win0.xy; vec2 Lnormal = normalize( vec2( -tangent.y, tangent.x)); vec2 offset = Lnormal * thickness; gl_Position.xy = vert0.xy + offset.xy; gl_Position.zw = vert0.zw; }
Тема в архиве.