Phong Tessellation 不弯曲对象

问题描述 投票:0回答:0

据我所知,我已经正确实施了 phong 镶嵌代码,如 http://www.klayge.org/material/4_0/PhongTess/PhongTessellation.pdf

尽管如此,当我在搅拌机的 icosphere 上使用形状因子 1 时,我的形状没有任何变化。它仍然是一个平面的球体,而不是根据形状因子向球体变形。

我发布了与 phong 曲面细分相关的顶点、外壳和域着色器代码,希望有人能弄清楚为什么它没有变成球体。

顶点:

VertexShaderOutput output;
    output.position = float4(input.position, 1.0f);
    // Combine object-instance-specific data with the world matrix before setting wPos, when we have time 
    output.wPos = mul(output.position, world);
    output.position = mul(output.position, mul(mul(world, view), projection));
    output.normal = mul(float4(input.normal, 0.0f), world);
    return output;

船体:

float CalcTessFactor(float3 v0WPos, float3 v1WPos)
{
    float edgeLen = distance(v0WPos, v1WPos);
    float edgeCamDist = distance((v0WPos+v1WPos)/2, camPos.xyz);
    
    return clamp((edgeLen*576) / (edgeCamDist*50), 1.0f, 63.0f);
}

HullShaderConstDataOutput CalcHSPatchConstants(InputPatch<HullShaderInput, NUM_CONTROL_POINTS> ip)
{
    HullShaderConstDataOutput output;
    
    if (ShouldPatchBeClipped(ip[0].position, ip[1].position, ip[2].position))
    {   output.EdgeTessFactor[0] = output.EdgeTessFactor[1] = output.EdgeTessFactor[2] = output.InsideTessFactor = 0;   }
    else
    {
        [unroll] for (int i=0; i<NUM_CONTROL_POINTS; i++) {output.EdgeTessFactor[i] = CalcTessFactor(ip[(i+1)%3].wPos.xyz, ip[(i+2)%3].wPos.xyz);}
        output.InsideTessFactor = (output.EdgeTessFactor[0] + output.EdgeTessFactor[1] + output.EdgeTessFactor[2]) / 3;
    }

    return output;
}

[domain("tri")]
[partitioning("fractional_odd")]
[outputtopology("triangle_cw")]
[outputcontrolpoints(3)]
[patchconstantfunc("CalcHSPatchConstants")]
HullShaderOutput main(InputPatch<HullShaderInput, NUM_CONTROL_POINTS> ip, uint i : SV_OutputControlPointID)
{   return ip[i];   }

域名:

#define NUM_CONTROL_POINTS 3

#define BARYCENTRIC_INTERPOLATE(structVar) u*patch[0].structVar + v*patch[1].structVar + w*patch[2].structVar

float3 OrtoProject(float3 q, float3 p, float3 n)
{
    return q - dot((q - p), n) * n;
}

[domain("tri")]
DomainShaderOutput main
(   DomainShaderConstDataInput input, float3 barycentric : SV_DomainLocation,
    const OutputPatch<DomainShaderInput, NUM_CONTROL_POINTS> patch  )
{
    DomainShaderOutput output;
    float u = barycentric.x, v = barycentric.y, w = barycentric.z;
    float3 Puv = BARYCENTRIC_INTERPOLATE(wPos.xyz);
    float shapeFactor = 1;
    output.wPos = float4((1 - shapeFactor)*Puv + shapeFactor * float3
    (
        u*OrtoProject(Puv, patch[0].wPos.xyz, patch[0].normal) +
        v*OrtoProject(Puv, patch[1].wPos.xyz, patch[1].normal) +
        w*OrtoProject(Puv, patch[2].wPos.xyz, patch[2].normal)
    ), 1.0f);
    output.position = mul(mul(output.wPos, view), projection);
    output.normal = BARYCENTRIC_INTERPOLATE(normal);
3d hlsl direct3d direct3d11 tessellation
© www.soinside.com 2019 - 2024. All rights reserved.