【问题标题】:Pixel bender normal map像素弯曲法线贴图
【发布时间】:2013-07-06 09:37:33
【问题描述】:

像往常一样提前谢谢..

我正在使用像素弯曲器为基于高度图的地形生成光照效果。我想制作地形的法线贴图,并从那里将每个法线点在给定的太阳方向上。确实很标准的东西,但是像素弯曲器玩得不好。我有这个代码:

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 被规范化,这不应该总是输出全蓝色?

我做错了什么?!?

【问题讨论】:

  • this 有帮助吗?
  • 谢谢,这是一本好书,很有趣,看看这个人是如何做到的;但是它产生的图像仍然是全蓝色的(或者,z = 1.0 正常)由于v1v2 是单位向量,我希望n 将是一个单位向量,并且无论v1.zv2.z 不是零,n.z 不应该是 1?我在这里错过了什么?

标签: flash graphics 3d pixel-bender


【解决方案1】:

我实际上在这里做了非常相似的事情,我的三角形带高度图。

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

这对我来说非常有效。在不到 100 毫秒的时间内通过 180 万个顶点。为了澄清起见,我将三角形定义为顶点之间的列。这意味着每 4 个顶点有两个三角形。我用“quadIdx”标识每个四边形的两个三角形。

注意:您正在规范化然后计算交叉 - 这是向后的,您需要在之后进行规范化。另外,我实际上相信我在 normalize() 中发现了一个错误。它在我没想到的地方创造了 NaN。我用 length() 实现了我自己的规范化,一切都很好!

【讨论】:

    猜你喜欢
    • 2018-08-21
    • 2019-12-10
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 2015-08-24
    相关资源
    最近更新 更多