Шейдер для неявного рендеринга кривых

Я попытался создать шейдер для неявного рендеринга кривых. К сожалению, это сбои в работе (проблема, скорее всего, заключается в геометрическом шейдере), отображая просто чистый экран.

Извиняюсь за возможно неправильную терминологию. Вместо того, чтобы аппроксимировать кривую с помощью линейной полосы, моя программа должна обработать каждый отдельный пиксель в определенной области и раскрасить его в соответствии с неявным уравнением, определяющим кривую — следовательно, неявный рендеринг.

Вершинный шейдер — принимает линейную полосу в качестве входных данных, две плоские координаты и угол между кривой и осью х в указанных координатах

#version 330 core

layout (location = 0) in vec2 x;
layout (location = 1) in float t;

out VS_OUT {
float t;
} vs_out;

void main ()
{
vs_out.t = t;
gl_Position = vec4 (vec3 (x, 0), 1);
}

геометрия шейдера — создает треугольник над линией, в которой тестируются отдельные пиксели

#version 330 core

layout (lines) in;
layout (triangle_strip, max_vertices = 50) out;

in VS_OUT {
float t;
} gs_in[];

out float k;

out vec2 R;

void main ()
{
vec2 A = vec2 (gl_in [0].gl_Position);
vec2 B = vec2 (gl_in [1].gl_Position);

float u = gs_in [0].t;
float v = gs_in [1].t;

float a = A.x - B.x;
float b = A.y - B.y;
float D = sin (u) * cos (v) - cos (u) * sin (v);

vec2 V = A + vec2 (cos (u), sin (u)) * (- sin (v) * a - cos (v) * b) / D;

float p = (cos (v) * a + sin (v) * b) / D;
float q = (- cos (u) * a - sin (u) * b) / D;

vec2 S = A + vec2 (sin (u), cos (u)) * p;

gl_Position = vec4 (vec3 (V, 0), 1);
R = V - S;
EmitVertex ();

gl_Position = gl_in [0].gl_Position;
k = p;
R = A - S;
EmitVertex ();

gl_Position = gl_in [1].gl_Position;
k = q;
R = B - S;
EmitVertex ();

EndPrimitive();
}

и фрагмент шейдера — цвета пикселя, расположенного в непосредственной близости от кривой, белого цвета

#version 330 core

in float k;

in vec2 R;

out vec4 bv;

float lyn (const float x)
{
if (abs (x) < 0.1)
return 1;
else
return 0;
}

float kv (const vec2 x, const float r)
{
return dot (x, x) - r * r;
}

void main ()
{
bv = vec4 (lyn (kv (R, k)));
}

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]