OpenGL에서 부드러운 질감 기반 윤곽 효과가 적용됩니다. 지금까지 나는 거의 모든 종류의 가장자리 감지 알고리즘을 시도했는데 대부분 원유 및 들쭉날쭉 한 윤곽선으로 나타났습니다. 그런 다음 Distance Field에 대해 읽었습니다. 꽤 좋은 거리 필드를 보여주는 예를 발견했습니다. 다음은 GLSL 코드는 다음과 같습니다GLSL 거리 필드 투명도
#version 420
layout(binding=0) uniform sampler2D colorMap;
flat in vec4 diffuseOut;
in vec2 uvsOut;
out vec4 outputColor;
const float ALPHA_THRESHOLD = 0.9;
const float NUM_SPOKES = 36.0; // Number of radiating lines to check in.
const float ANGULAR_STEP =360.0/NUM_SPOKES;
const int ZERO_VALUE =128; // Color channel containing 0 => -128, 128 => 0, 255 => +127
int in_StepSize=15; // Distance to check each time (larger steps will be faster, but less accurate).
int in_MaxDistance=30; // Maximum distance to search out to. Cannot be more than 127!
vec4 distField(){
vec2 pixel_size = 1.0/vec2(textureSize(colorMap, 0));
vec2 screenTexCoords = gl_FragCoord.xy * pixel_size;
int distance;
if(texture(colorMap, screenTexCoords).a == 0.0)
{
// Texel is transparent, search for nearest opaque.
distance = ZERO_VALUE + 1;
for(int i = in_StepSize; i < in_MaxDistance; i += in_StepSize)
{
if(find_alpha_at_distance(screenTexCoords, float(i) * pixel_size, 1.0))
{
i = in_MaxDistance + 1; // BREAK!
}
else
{
distance = ZERO_VALUE + 1 + i;
}
}
}
else
{
// Texel is opaque, search for nearest transparent.
distance = ZERO_VALUE;
for(int i = in_StepSize; i <= in_MaxDistance; i += in_StepSize)
{
if(find_alpha_at_distance(screenTexCoords, float(i) * pixel_size, 0.0))
{
i = in_MaxDistance + 1; // BREAK!
}
else
{
distance = ZERO_VALUE - i;
}
}
}
return vec4(vec3(float(distance)/255.0) * diffuseOut.rgb, 1.0 - texture(colorMap, screenTexCoords).a);
}
void main()
{
outputColor= distField();
}
이 쉐이더의 결과는 거리 필드 outline.Here 외부 화면 영역을 채우는 확산 색상을 사용하여 전체 화면을 보이는 방법을 덮는 같은 :
내가 필요한 것은 거리 필드 외부의 단색 빨강 채우기가있는 모든 영역을 투명하게 유지하는 것입니다.
블렌딩을 활성화 했습니까? 알파 값을 출력하는 것만으로는 충분하지 않습니다. 알파를 올바른 투명도로 해석하는 방법을 알고있는 블렌드 모드를 활성화해야합니다. – Tim
나는 아마도 당신의 문제를 해결하는 @Tim에 동의한다. 완전을 위해, 전체 화면 쿼드를 렌더링하고 있습니까? – pauluss86
제공된 스크린 샷을주의 깊게 살펴보면서, 나는 인공물로 간주 될 수있는 것을 발견했습니다. 빨간색 획 내부에 흰색 선이 나타나고 뇌졸중 자체가 약간 들쭉날쭉 해 보입니다. 특히 '볼록한'부분. 첫 번째 방법은 텍스처 좌표가 텍스처 맵의 픽셀 중심을 참조하는지 확인하여 해결할 수 있습니다. 두 번째 문제는 링크 된 기사에는 나타나지 않지만 알파 블렌딩 문제와 관련 될 수 있습니다. – pauluss86