中文第一计算机图形学社区OpenGPU 版权所有2007-2018

 找回密码
 注册

扫一扫,访问微社区

搜索
查看: 1498|回复: 2

请问龚大如何理解 VertexDisplacement 里面的法线计算?

[复制链接]
发表于 2017-11-26 22:26:57 | 显示全部楼层 |阅读模式
请问龚大如何理解 VertexDisplacement 里面的法线计算?
在 VertexDisplacement 示例中,旗子的振幅从左至右线性增大。
比如下列代码中的 x_dir 的 z 分量的计算,是使用使用右边点的 z 值减 当前点的 z 值计算的吗?
比方说设currentAngle 等于 0,对于点(-2, 1.5,0) offset.xy 都是 0,有 z = (1+0)*0*0.2  = 0
则右边点(-1.5, 1.5, 0) 的 offset.xy = (0.5, 0),有 z = (cos(0.5) + sin(0.5)) * 0.5 * 0.2 = 0.132
而 x_dir 的 z = -sin(-2) * 0.2 = 0.18,差距比较大。
如果不同地方的振幅变化,高度差为 (cos(0.5) + sin(0.5)) * 0.2 - (1+0) * 0.2 = 0.064,差距也很大?求助龚大这个是如何计算的呢?

void VertexDisplacementVS(float4 pos                        : POSITION,
                                                                float2 texcoord0        : TEXCOORD0,
                                                                out float2 oTexcoord0        : TEXCOORD0,
                                                                out float3 oNormal                : TEXCOORD1,
                                                                out float4 oPos                        : SV_Position)
{
        pos = float4(pos.xyz * pos_extent + pos_center, 1);

        float4 v = pos;
        float2 offset = pos.xy + float2(half_length, -half_width);
        v.z = (cos(offset.x + currentAngle) + sin(offset.y + currentAngle)) * offset.x * 0.2f;

        float3 x_dir = float3(0.5f, 0, -sin(pos.x + currentAngle) * 0.2f);
        float3 y_dir = float3(0, 0.5f, cos(pos.y + currentAngle) * pos.x * 0.2f);
        float3 normal = mul(cross(x_dir, y_dir), (float3x3)modelview);

        oPos = mul(v, mvp);
        oNormal = normal;
        oTexcoord0 = texcoord0;
}
发表于 2017-12-9 06:00:40 | 显示全部楼层
随便写的
 楼主| 发表于 2018-1-11 11:36:42 | 显示全部楼层
gongminmin 发表于 2017-12-9 06:00
随便写的

噗,我输出了法线颜色,居然真是随便写的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|小黑屋|Archiver|手机版|中文第一计算机图形学社区OpenGPU

GMT+8, 2018-7-21 04:34 , Processed in 0.038221 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表