2013-06-07 5 views
1

나는 하나의 구체 만있는 3D 장면이 있으며 두 개의 텍스처가 있습니다. 하나는 밤에, 다른 하나는이 행성의 날입니다. 또한 내 장면에 lightSource (15,15,15)가 있습니다. 구의 각 정점에 대해서도 나는 정상입니다.구체의 두 텍스처 사이의 크로스 페이드

이제는 두 가지 질감을 혼합하여 낮과 밤 사이의 색이 흐려지는 것을 사실적으로 보입니다. 따라서 내적을 사용하여 정상과 빛 사이의 각도를 계산합니다. 그러나이 방법을 사용하면 각도가 0보다 큰지 (즉, 요일이 될지)를 확인하면 단단한 크로스 오버를 얻습니다. 각도에 따라 텍스처를 혼합해야합니다. 부드러운 크로스 오버입니다.

텍스처를 어떻게 혼합 할 수 있습니까? 지금까지 내 코드 :

float angle = dot(L,N); 
vec4 texture = texture2D(day, textureCoord);   

texture = texture2D(night,textureCoord) * (1-angle) + texture * angle; 
vec4 light = vec4(ambientTerm + diffuseTerm + specularTerm , 1); 

if(angle > 0) { 
    color = light * texture; 
} else if(angle >= -0.25) { 
    color = texture2D(night,textureCoord)*(angle-1) + texture * (angle); 
} else if(angle < -0.25) { 
    color = texture2D(night,textureCoord); 
} 

답변

2

당신은 사이에있는 작은 원활하게 전환과 0/1 결정에 연속 값을 설정하기 위해 smoothstep function을 사용할 수 있습니다. 그래서 기본적으로 변환이되는 범위를 정의합니다. [-0.25,0.25]는 약 75도에서 105도 사이의 각도 범위입니다 (더 큰 transistion 영역에 대해서는 더 큰 값을 가져야하지만 대칭으로 만들려고 시도합니다. 따라서 사람들은 이미 해질녘에 불을 켜기 때문에 약 90도를 중심으로). 그렇다면 우리는 이름 불행히도, 선택된 소정 비트 비록 그것이 각도 아닌 실제 각도 역 동작하는지 (angle 될 것이다

angle = smoothstep(-0.25, 0.25, angle) 

를 이용하여 우리 [-1,1] 단조 코사인 변환)이 0이면 < -0.25이고, > 0.25이면 1이고 중간에 있으면 부드러운 전환입니다. 그리고 전체 텍스처링은 (경우에 이상한에서 청소하고 내장 mix function 사용하기)과 같을 것이다 : 재미와 더 효율적인 완전성을 위해,

float angle = dot(N, L); 
vec4 nightColor = texture2D(night, textureCoord); 
vec4 dayColor = texture2D(day, textureCoord); 
color = light * mix(nightColor, dayColor, smoothstep(-0.25, 0.25, angle)); 

또는

color = light * mix(texture2D(night, textureCoord), 
        texture2D(day, textureCoord), 
        smoothstep(-0.25, 0.25, dot(N, L)));