2013-06-20 7 views
0

OpenGL ES2.0 용 GLSL에서 프래그먼트 셰이더를 작성하는 데 익숙하지 않고 주어진 그래픽에 베벨 효과를 생성하는 프래그먼트 셰이더를 만들려고합니다. 여기에 지금까지 을 할 수있었습니다 무엇 (단지 경사 효과가 적용되는 상단 부분에 보면, 낮은 벽 및 기타 텍스처를 무시) : 여기Open GL ES 2.0에서 적절한 경사 효과 조각 쉐이더를 만드는 방법은 무엇입니까?

Current output

하면 원하는 무엇 결과는해야한다 : 대각선에서 음영의 차이

Desired output

주의, 그들은 더 가볍게 수평 가장자리보다 음영. 대각선 모서리에서 수평 또는 수직으로의 전환을 확인하십시오. 또한 경사의 두께에 주목하십시오. 가능한 한이 원하는 결과에 가까워지고 싶습니다.

는 지금 내가 사용하고 프래그먼트 쉐이더 여기에, 매우 간단 코드입니다 :

#ifdef GL_ES 
precision mediump float; 
#endif 

varying vec2 v_texCoord; 
uniform sampler2D s_texture; 
uniform float u_time; 

void main() 
{ 
    vec2 onePixel = vec2(0, 1.0/640.0); 

    vec2 texCoord = v_texCoord; 

    vec4 color; 
    color.rgb = vec3(0.5); 
    color += texture2D(s_texture, texCoord - onePixel) * 5.0; 
    color -= texture2D(s_texture, texCoord + onePixel) * 5.0; 

    color.rgb = vec3((color.r + color.g + color.b)/3.0); 
    gl_FragColor = vec4(color.rgb, 1); 
} 

는 내가 원하는 효과를 만들어 내 쉐이더에 추가 할 필요가?

+0

안녕하세요, Eddy, 어떻게 해결 했습니까? –

답변

0

당신이 보여준 예제가 조각 셰이더 코드로 완전히 완료되지 않았다고 생각합니다. ES에서 존재하지 않는 것을 제외하고는 기하학 쉐이더에 의해 수행 될 수있는 기하학을 베벨 링하여 수행되었을 가능성이 높습니다. 그래서 블렌더와 같은 저작 도구를 사용하여 모형에 경사를 부여하거나 텍스처를 사용합니다 범프 맵핑 기술.

+0

당신이 옳을 수도 있지만, 결국에는 원하는 효과를 충분히 출력하는 프래그먼트 쉐이더를 작성할 수있었습니다. –

+3

@EddyBorja 여기 최종 솔루션을 공유해야합니다 :) 비슷한 상황에 있습니다 ... – rottz

0

베벨 효과를 얻는 가장 좋은 방법은 블렌더 또는 다른 편집기로 메쉬를 수정하는 것입니다.

Shader에서이 작업을 수행하려면 가장자리를 숨기기 위해 특별히 준비된 범프 맵을 사용하는 것이 좋습니다.

일부 다중 패스 및 렌더링 버퍼 솔루션이있을 수 있지만 그에 대해 많이 알지 못합니다. 깊이 버퍼에서 가장자리를 찾을 수 있습니다. 그러나 성능 측면에서 가장 좋은 방법은 아닙니다.

저는 최근 특별한 질감과 변화하는 기하학없이 베벨 효과를 얻는 방법을 발견했습니다. (그래서 나는이 질문에 대답하고 있습니다. :) 그러나 꼭지점 데이터를 수정해야합니다. 실제로는 다른 법선 벡터를 각 꼭지점에 추가해야합니다. 따라서 메시를 해당 쉐이더와 함께 작동하도록 변환해야합니다. article