2013-03-11 168 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)有帮助吗? – 2013-03-11 10:09:32

+0

谢谢,看看这个人是怎么做的,这是一个很好的阅读和有趣的事情;然而,它产生的图像仍然是全蓝色(或者,正常情况下,z = 1.0)由于'v1'和'v2'是单位矢量,因此我认为'n'将是一个单位矢量, v1.z'或'v2.z'不是零,'nz'不应该是1? 我在这里错过了什么? – Pez 2013-03-11 20:40:29

回答

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); 
} 

这对我来说非常好。在100ms内运行180万个顶点。为了澄清,我将三角形定义为顶点之间的列。这意味着每4个顶点有两个三角形。我用“quadIdx”标识每个四边形的两个三角形。

注意:你正在规范,然后计算交叉 - 这是倒退,你需要规范化之后。另外,我确实相信我在normalize()中发现了一个bug。它创造了我没想到的NaN。我用length()实现了我自己的规范化,并且这一切都很好!