2013-03-11 6 views
0

평소와 같이 미리 감사드립니다.픽셀 벤더 노멀 맵

저는 하이트 맵 기반 지형에 대한 조명 효과를 생성하기 위해 픽셀 벤더를 사용하고 있습니다. 저는 지형의 법선 맵을 만들고 거기에서 주어진 태양 방향에 대해 각 법선을 도트 싶습니다. 꽤 표준적인 것이지만, 픽셀 벤더는 훌륭하게 연주하지 않습니다. 이 코드를 가지고 :

void 
evaluatePixel() 
{ 
    float2 pt = outCoord(); 

    pixel3 a = sampleNearest(src,pt); 
    pixel3 b = sampleNearest(src,float2(pt.x + 1.0, pt.y)); 
    pixel3 c = sampleNearest(src,float2(pt.x, pt.y + 1.0)); 

    float3 v1 = float3(1.0, 0.0, b.r - a.r); 
    float3 v2 = float3(0.0, 1.0, c.r - a.r); 

    normalize(v1); 
    normalize(v2); 

    float3 n = cross(v1,v2); 

    dst = pixel3(n.x,n.y,n.z); 
} 

정상적인지도를 생성 할 것으로 예상됩니다. 테스트하기 위해 빛을 똑바로 가리키고 출력 색상으로 n.z을 사용한다고 가정했습니다. 이렇게하면 단색이됩니다. 위의 코드를 실행하여 실행하면 빨간색과 녹색의 변형이있는 반면 파란색은 항상 255로 가득 차 있음을 알 수 있습니다. 이유가 무엇입니까? 나는 v1v2을 고려할 때 이것이 항상 완전한 청색을 출력하지 않아야한다는 것을 알았습니까?

내가 뭘 잘못하고 있니?!?

+0

[this] (http://www.adobe.com/cfusion/exchange/index.cfm?event=extensionDetail&extid=1817528) 도움이 되셨습니까? –

+0

덕분에,이 사람이 어떻게했는지보기에 좋은 독서력과 흥미로 웠습니다. 그러나 그것이 생산하는 이미지는 여전히 완전한 파란색을 가지고 있습니다. (보통, z = 1.0) 'v1'과'v2'는 단위 벡터이기 때문에'n'은 단위 벡터가 될 것이고' v1.z' 또는'v2.z'는 0이 아니며,'nz'는 1이 아니어야합니까? 여기에 무엇이 누락 되었습니까? – Pez

답변

0

실제로 삼각형 스트립 높이 맵을 사용하여 여기에서 매우 유사한 작업을 수행했습니다.

input image3 verts; 
output pixel3 triNorms; 

void 
evaluatePixel() 
{ 
    float2 tCoord = outCoord() - 0.5; //move coord from pixel center to lower-left corner 
    float quadIdx = mod(tCoord[0], 2.0); //potentially faster to use sign(fract(tCoord[0]/2.0)) 
    float2 vCoord0 = float2(floor(tCoord.x/2.0), tCoord.y); 
    float2 vCoord1 = float2(vCoord0.x + 1.0, vCoord0.y + 1.0 - quadIdx); 
    float2 vCoord2 = float2(vCoord0.x + quadIdx, vCoord0.y + 1.0); 
    float3 v0 = sampleNearest(verts, vCoord0 + 0.5); 
    float3 v1 = sampleNearest(verts, vCoord1 + 0.5); 
    float3 v2 = sampleNearest(verts, vCoord2 + 0.5); 
    float3 s0 = v1 - v0; 
    float3 s1 = v2 - v0; 
    float3 n = cross(s0, s1); 
    float len = 1.0/length(n); 
    n.x *= len; 
    n.y *= len; 
    n.z *= len; 
    triNorms = float3(n.x, n.y, n.z); 
} 

이것은 나를 위해 놀랍도록 잘 작동합니다. 100m 미만의 속도로 1.8M 정점을 통과합니다. 명확히하기 위해 꼭 삼각형을 정점 사이의 열로 정의합니다. 이것은 4 개의 꼭지점마다 2 개의 삼각형이 있음을 의미합니다. 나는 "quadIdx"로 쿼드 당 두 개의 삼각형을 식별합니다.

참고 : 정상화하고 십자가를 계산합니다. 이것은 거꾸로되어 있습니다. 이후 정상화해야합니다. 또한, 나는 실제로 normalize()에서 버그를 발견했다. 그것은 내가 예상하지 못한 NaN을 만들었습니다. 나는 길이()로 내 자신의 정규화를 구현하고 모두 훌륭한 작품!