2012-08-14 1 views
0

을 향상 : 내가 선을 흐리게하는 데 사용하고나는이 조각 셰이더을 향상시킬 수있는 방법 OpenGL을 2.0 조각 쉐이더

#ifdef GL_ES 
precision mediump float; 
#endif 

varying vec4 v_fragmentColor; 
varying vec2 v_texCoord; 

uniform sampler2D u_texture; 

uniform vec2 blurSize; 
uniform vec4 substract; 

    void main() { 
    vec4 sum = vec4(0.0); 
    sum += texture2D(u_texture, vec2(v_texCoord.x - 4.0 * blurSize.x, v_texCoord.y)) * 0.05; 
    sum += texture2D(u_texture, vec2(v_texCoord.x - 3.0*blurSize.x, v_texCoord.y)) * 0.09; 
    sum += texture2D(u_texture, vec2(v_texCoord.x - 2.0*blurSize.x, v_texCoord.y)) * 0.12; 
    sum += texture2D(u_texture, vec2(v_texCoord.x - blurSize.x, v_texCoord.y)) * 0.15; 
    sum += texture2D(u_texture, vec2(v_texCoord.x, v_texCoord.y)) * 0.16; 
    sum += texture2D(u_texture, vec2(v_texCoord.x + blurSize.x, v_texCoord.y)) * 0.15; 
    sum += texture2D(u_texture, vec2(v_texCoord.x + 2.0*blurSize.x, v_texCoord.y)) * 0.12; 
    sum += texture2D(u_texture, vec2(v_texCoord.x + 3.0*blurSize.x, v_texCoord.y)) * 0.09; 
    sum += texture2D(u_texture, vec2(v_texCoord.x + 4.0*blurSize.x, v_texCoord.y)) * 0.05; 
    gl_FragColor = sum;  
} 

, 대부분의 시간은 같은 색상을 혼합되도록. 나는 주변 색이 같은 픽셀을 무시 (배경색으로 남겨두기)하고 싶습니다. 내가 어떻게 할 수 있니?

답변

3

선 색상 검사를 무시하면 텍스쳐 좌표 계산을 버텍스 쉐이더로 옮긴 다음이를 가변 점으로 전달하는 것이 좋습니다. 예를 들어, 버텍스 쉐이더로 vec2(v_texCoord.x - 4.0 * blurSize.x, v_texCoord.y)을 움직일 수, 당신은 당신의 조각 쉐이더에서

sum += texture2D(u_texture, firstTextureCoordinate) * 0.05; 

을 할 필요가 있도록 변하는 firstTextureCoordinate로 전달합니다.

두 가지 중요한 이점이 있습니다. 첫째, 모든 조각에서 계산을 수행하는 대신 정점 당 한 번만 계산을 실행 한 다음 빠른 하드웨어 보간을 사용하여 조각 쉐이더로 가져옵니다. 일반적으로 조각보다 정점 수가 훨씬 적기 때문에 계산을 줄일 수 있습니다.

두 번째 및 더 중요한 장점은 iOS 장치의 PowerVR 시리즈와 같은 타일 기반 지연 렌더러에서 달라진 것으로 제공된 좌표에서 텍스처 가져 오기를 수행하면 종속 텍스처 읽기가 방지된다는 것입니다. 이것은 GPU가 텍스쳐 페치 (fetch)에 대해 좋은 캐싱을 할 수있게 해 주며,이 특정 하드웨어의 성능에 커다란 차이가 있음을 알았습니다.

영리한 논리를 사용하면 여전히 텍스처 페치 수를 줄일 수 있지만이 방법은 OpenGL ES 조각 쉐이더에서 모든 곳에서 사용하는 간단한 최적화이며 항상 멋진 성능 향상을 제공합니다.

1

쉐이더에서 많은 수표를 확인하는 것은 불가능합니다.

다른 옵션은 아마도 선의 가운데 (사용자의 x 좌표 만)가 될 셰이더에 알려주는 유니폼 (또는 많은 선이있는 경우 유니폼 배열)을 추가하는 것입니다.

쉐이더는 다음과 같이 체크하면 단일를 가질 수 있습니다 : 당신이하는 주위 흐리게받지 않는 빈 공간이 많은 경우 전반적인 성능을 향상시킬 수

float spread = 4.0 * blurSize.x; 
if(lineCentre-spread < gl_FragCoord.x && gl_FragCoord.x < lineCentre+spread){ 
    //You existing logic for blurr goes here. 
}else{ 
    gl_FragColor = texture2D(u_texture, vec2(v_texCoord.x, v_texCoord.y)) * 0.16; 
} 

.