2011-07-05 6 views
-3

높이 맵의 2 차원 타일 기반지도와 이미지가 있습니다.이 맵을 사용하면지도 모양이 덜 평평 해집니다. 그러나 나는 SFML에서 사용되는 GLSL을 처음 사용합니다. 나는 GLSL 쉐이더를 찾고 있는데, 타일 텍스쳐와 높이 맵의 일부분을 동일한 좌표 또는 뭔가 높이 환상을 만들기 위해 전달할 수 있습니다. 하지만 저는 혼자서 모든 것을하고 있습니다. GLSL을 배울 시간이 없으니, 답장을 보내 주셔서 감사합니다. (누군가가 셰이더 코드를 게시하고 인형에 대해 설명 할 수 있다면 어떨까요? .cpp 파일에서 사용됨)높이 맵 렌더링을 사용하는 2D 지형으로의 GLSL 코드

+5

은, 지금까지 당신을 얻을 가능성이 없습니다 "나는이 단지에 대한 GLSL을 배울 수있는 시간을 가지고 있겠지." 그러나, 당신에게 몇 가지 아이디어를 제공합니다 : 더 높은 지상 라이터를 음영 처리하면 AO 근사값이 저렴해질 수 있습니다. dFdx/dFdy를 사용하면 지형의 법선이 어디에 있는지 추정 할 수 있습니다. 태양에 대한 빛의 벡터를 정착하고 내적을 취하십시오. 그것은 "태양"을 향한 언덕 쪽을 더욱 밝게 만들어주고 깊이있는 환상을줍니다. – Damon

+4

코드를 입력하십시오. – pmr

답변

0

아마도 "Parallax Occlusion Mapping" 기술에 관심이있을 것입니다. 좋은 구현은 here입니다.

+0

감사합니다. 좋은 예입니다. 일부 GLSL 자습서를 읽었지만 그 쉐이더에 무엇을 전달해야하는지 아직 이해하지 못합니다. GLSL 코드에 정의 된 모든 유창 변수를 초기화해야합니까? – Reiv

+0

다음 변수를 설정해야합니다. uniform mat4 matView; 균일 한 mat3 matViewProjection; uniform float fHeightScale; 균일 한 float fPerspectiveBias; uniform vec4 vLightOffset; – Constantinius

+0

2D 타일 기반 렌더링에서는 시차 오 클루 젼 매핑이 실제로 많이 사용되지 않는다는 점에 유의해야합니다. 2D 타일 기반은 "하향식"뷰를 의미하며,이 경우 시차는 0입니다. 비록 POM과 함께 자주 계산되는 자기 폐색 용어를 사용할 수도 있지만. 이것은 약간의 인상을 줄 것입니다. – Damon

0

높이 맵의 환상을주기 위해 화면에서 Z를 걷어 찰 것입니다. 실제로 형상을 변경하지는 않습니다. 이것은 위에서 아래로 내려가보기에는 유용하지 않습니다 .. Id는 새로운 Z와 빛의 방향에 따라 어떤 종류의 그림자 효과를 추가하려고합니다.

다음 줄 : pos.z + = color.x + color.y + color.z;은 Z를 푸시하는 요소입니다. 스케일에 양수 또는 음수를 지정할 수 있습니다.

/* Vertex Program 
* Shifts Z by Textures color  
*/ 
uniform sampler2D color_texture; 
uniform float scale; 
varying vec4 p_color; 
void main() 
{ 
    vec2 texcoords = gl_MultiTexCoord0.st; 
    p_color = texture2D(color_texture,texcoords); 
    vec4 color = texture2D(color_texture,texcoords); 
    vec4 pos = gl_Vertex; 
    pos.z += color.x + color.y + color.z; 
    pos.z*=scale; 
    gl_Position = gl_ModelViewProjectionMatrix * pos; 
} 

그리고 여기에 아주 간단한 조각 프로그램입니다 ..

/* Fragment Program 
    Copies incoming fragment color without change. 
*/ 
varying vec4 p_color; 
void main() 
{ 
    gl_FragColor = p_color; 
} 
0

이 빛이 세계 공간에 사상 버블/돔 모양의베이스와 지형 메쉬를 변형. 지형이 더 많이 모자이크 될수록 결과가 좋습니다. 누군가가 다소 모호한 설명을 기반으로 쉐이더 바인딩을 포함, 당신을 위해 모든 코드를 작성하는 것 같지는 이후

Const Float PI = 3.1415928; 
vec3 vVertex = vec3(gl_Vertex); 
float d = distance(lightPos , gl_Vertex); 
float d2; 
    if (d < 1500.0) 
    { 
    d2 = d/1500.0; 
    d = cos(PI*2.0*d2); 
    } 
    else 
    { 
    d=0.0; 
    d2=0.0; 
    } 
vVertex.y += (d*75.0)*(1.0-d2)-50.; 

gl_Position = gl_ModelViewProjectionMatrix* vec4(vVertex,gl_Vertex.w);