Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.X GLSL] Shader - Kontur o stałej szerokości w px

Ostatnio zmodyfikowano wczoraj o godz. 18:12
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
[SFML 2.X GLSL] Shader - Kontur o stałej szerokości w px
» 2025-08-29 16:32:10
Witam. Próbuję napisać Shader w SFML 2.6.2 działający w ten sposób, że renderuje outline w danym kolorze o stałej szerokości pikseli. Stała szerokość pikseli to np. 2px w taki sposób, że są to piksele ekranu a nie piksele canvasu. ChatGPT wymiękł i podaje mi cały czas szerokość pikseli w oparciu o renderowany canvas a ja chcę stałą szerokość obramowania. Żeby zawsze bez względu na zoom i canvas było 2px. Tylko 2px... :-/ Wie ktoś jak to zrobić ?

bez zoomu


i tu pogrubia kontur a chcę, żeby kontur był takiej samej szerokości jak na poprzednim screenie..


C/C++
std::string lasso_only_outline_source = R"( uniform sampler2D mask; uniform vec2 maskSize; uniform float outlineSize; uniform vec4 outlineColor; void main() { vec2 uv = gl_TexCoord[0].xy; float aCenter = texture2D(mask, uv).a; vec2 texel = 1.0 / maskSize; int r = int(floor(outlineSize + 0.5)); float aMax = 0.0; float aMin = 1.0; for (int j = -r; j <= r; ++j) { for (int i = -r; i <= r; ++i) { vec2 off = vec2(float(i), float(j)) * texel; float s = texture2D(mask, uv + off).a; aMax = max(aMax, s); aMin = min(aMin, s); } } float dilated = step(0.5, aMax); float eroded = step(0.5, aMin); float edge = clamp(dilated - eroded, 0.0, 1.0); gl_FragColor = vec4(outlineColor.rgb, outlineColor.a * edge); } )";
P-182932
tBane
Temat założony przez niniejszego użytkownika
» 2025-08-29 20:32:35
Uprościłem trochę kod shadera, ale nadal szerokość kontura nie jest skalowana w taki sposób by zawsze była taka sama.

C/C++
std::string lasso_only_outline_source = R"( uniform sampler2D mask; uniform vec2 maskSize; uniform float outlineSize; uniform vec4 outlineColor; void main() { vec2 uv = gl_TexCoord[0].xy; vec2 r = vec2(outlineSize, outlineSize); float aMax = 0.0; float aMin = 1.0; for (int y = -r.y; y <= r.y; ++y) { for (int x = -r.x; x <= r.x; ++x) { float s = texture2D(mask, uv + vec2(x, y)).a; aMax = max(aMax, s); aMin = min(aMin, s); } } float dilated = step(0.5, aMax); float eroded = step(0.5, aMin); float edge = clamp(dilated - eroded, 0.0, 1.0); gl_FragColor = vec4(outlineColor.rgb, outlineColor.a * edge); } )";
P-182933
tBane
Temat założony przez niniejszego użytkownika
» 2025-08-29 21:51:41
W poprzednim shaderze występowały artefakty na krańcach canvasu. Teraz poprawiłem ale nadal zaznaczenie nie ma stałego rozmiaru. Jak tego nie zrobię to mówi się trudno ale byłoby miło jak by się udało :-)

C/C++
std::string lasso_only_outline_source = R"( uniform sampler2D mask; uniform vec2 maskSize; // w pikselach (width, height) uniform float outlineSize; // promień w pikselach uniform vec4 outlineColor; void main() { vec2 uv = gl_TexCoord[0].xy; vec2 texel = 1.0 / maskSize; int r = outlineSize; float aMax = 0.0; float aMin = 1.0; for (int j = -r; j <= r; ++j) { for (int i = -r; i <= r; ++i) { vec2 coords = uv + vec2(i, j) * texel; coords = clamp(coords, texel * 0.5, 1.0 - texel * 0.5); float s = texture2D(mask, coords).a; aMax = max(aMax, s); aMin = min(aMin, s); } } float dilated = step(0.5, aMax); float eroded = step(0.5, aMin); float edge = clamp(dilated - eroded, 0.0, 1.0); gl_FragColor = vec4(outlineColor.rgb, outlineColor.a * edge); } )";
P-182934
tBane
Temat założony przez niniejszego użytkownika
» 2025-08-30 18:12:51
Zrozumiałem ten algorytm częściowo ale odpowiedź na to pytanie brzmi - nie da się. Powiększasz za każdym razem piksele maski i dlatego są pogrubione.
P-182935
« 1 »
  Strona 1 z 1