2017-10-19 6 views
1

현재 SFL을 사용하여 glsl에 간단한 외곽선 쉐이더를 쓰려고합니다. 나는 쉐이더 프로그래밍에 익숙하지 않으므로 그 질문이 명백하다면 나를 용서해주십시오. 어쨌든 셰이더는 텍스처 내에서 가장자리를 감지하는 데는 문제가 없지만 텍스처 가장자리에서는 경계선을 감지하지 못합니다. 윤곽 셰이더의 작업 Picture of the working outlineShader프래그먼트가 텍스처 가장자리에 있는지 확인하는 방법


outlineShader 사진의

사진 여기 Picture of the outline shader not working correctly


내 조각 쉐이더의 코드 제대로 작동하지

uniform sampler2D texture; 
uniform float outlineThickness; 
uniform vec2 textureSize; 
uniform vec3 outlineColor; 

void main() 
{ 
    vec2 offx = vec2(outlineThickness/textureSize.x, 0.0); 
    vec2 offy = vec2(0.0, outlineThickness/textureSize.y); 

    float surroundingAlphaSum = texture2D(texture, gl_TexCoord[0].xy + offx).a + 
     texture2D(texture, gl_TexCoord[0].xy - offx).a + 
     texture2D(texture, gl_TexCoord[0].xy + offy).a + 
     texture2D(texture, gl_TexCoord[0].xy - offy).a; 

    // This pixel 
    vec4 pixel = texture2D(texture, gl_TexCoord[0].xy); 

    // If one of the surrounding pixels is transparrent --> an edge is detected 
    if (4.0 * pixel.a - surroundingAlphaSum > 0.0) 
    pixel = vec4(outlineColor, 1.0); 
    else 
    pixel = vec4(0.0); // transparrent 

    gl_FragColor = pixel * gl_Color; 
} 
(난 단지 조각 쉐이더가)

근본적으로 내가 찾고있는 것은 이웃 픽셀이 여전히 텍스처에 속해 있는지 여부를 결정하는 방법입니다.

BTW : gl_TexCoord[0].xy은 shadermodel #version 120 이후에 양보 된 것처럼 보입니다. 대안은 많이 감사하겠습니다. 당신의 도움을

감사합니다,

애드리안

답변

0

detect edges하는 방법은 여러 가지가 있습니다. 불행히도 저는 Matlab에서 그것들을 다루었지만 어쩌면 링크를 통해 어떤 기능을 구현할 수 있습니다.

내 과거의 경험으로

, 당신은 0 또는

0

1. 당신이 시도해야 함은 가장자리 나하지 않는 경우에, 각 픽셀에 대한 계산 여분의 행렬을 작성, 다음 이미지를 포함하고 매트릭스와 함께 작동해야한다 샘플 8 텍셀? 어떤 경우에는 커널이 불완전한 것처럼 보입니다.

float surroundingAlphaSum = texture2D(texture, gl_TexCoord[0].xy + offx).a + 
    texture2D(texture, gl_TexCoord[0].xy - offx).a + 
    texture2D(texture, gl_TexCoord[0].xy + offy).a + 
    texture2D(texture, gl_TexCoord[0].xy - offy).a + 
    texture2D(texture, gl_TexCoord[0].xy + offx + offy).a + 
    texture2D(texture, gl_TexCoord[0].xy + offx - offy).a + 
    texture2D(texture, gl_TexCoord[0].xy - offx + offy).a + 
    texture2D(texture, gl_TexCoord[0].xy - offx - offy).a; 

// ... 

if (8.0 * pixel.a - surroundingAlphaSum > 0.0) 

// ... 
+0

네, 저의 첫 번째 시도였습니다. 나는 더 큰 (transparrent) 렌더 텍스처를 먼저 그린 다음 renderTexture에 그 쉐이더를 적용함으로써 해결 방법을 발견했다. 가장자리가 더 이상 텍스처의 가장자리에 있지 않지만 탱크 성능이 상당히 느려지므로 작동합니다. 답변 해 주셔서 고맙습니다 ^^ –