C# SharpDX:在不编辑模型的情况下获得平滑网格的正确方法是什么

C# SharpDX:在不编辑模型的情况下获得平滑网格的正确方法是什么,c#,directx,shader,mesh,sharpdx,C#,Directx,Shader,Mesh,Sharpdx,我正在用c#-SharpDX加载obj文件。一切正常,我使用指定的材质获得网格,但网格并不真正平滑: 正如我在主题中提到的,我不想在外部工具中编辑网格。 我想我应该编辑我的着色器,但我不是很确定。在sharpdx中是否有一些选项可以使网格平滑或诸如此类。 我也尝试过,就像我已经说过的,编辑我的着色器,但很轻松。 也许有人能把我推向正确的方向。 这是具有法线映射的着色器代码: cbuffer data :register(b0) { float4x4 world; float4x

我正在用c#-SharpDX加载obj文件。一切正常,我使用指定的材质获得网格,但网格并不真正平滑:

正如我在主题中提到的,我不想在外部工具中编辑网格。 我想我应该编辑我的着色器,但我不是很确定。在sharpdx中是否有一些选项可以使网格平滑或诸如此类。 我也尝试过,就像我已经说过的,编辑我的着色器,但很轻松。 也许有人能把我推向正确的方向。 这是具有法线映射的着色器代码:

cbuffer data :register(b0)
{
    float4x4 world;
    float4x4 worldViewProj;
    float4 lightDirection;
    float4 viewDirection;
    float bias;
};

struct VS_IN
{
    float4 position : POSITION;
    float3 normal : NORMAL;
    float3 tangent: TANGENT;
    float3 binormal: BINORMAL;
    float2 texcoord : TEXCOORD;
};

struct PS_IN
{
    float4 position : SV_POSITION;
    float3 normal : NORMAL;
    float2 texcoord : TEXCOORD;
    float3 lightDirection:LIGHT;
    float3 viewDirection:VIEW;
};

//texture
Texture2D textureMap:register(t0);
Texture2D normalMap:register(t1);
SamplerState textureSampler;

PS_IN VS( VS_IN input)
{
    PS_IN output = (PS_IN)0;

    float3 B=mul(world,input.binormal);
    float3 T=mul(world,input.tangent);
    float3 N=mul(world,input.normal);

    output.position = mul(worldViewProj,input.position);
    output.normal=N;
    output.texcoord=input.texcoord;



    float3x3 Tangent={T,B,N};
    output.lightDirection=mul(Tangent,lightDirection.xyz);
    output.viewDirection= mul(Tangent,viewDirection.xyz);

    return output;
}

float4 PS( PS_IN input ) : SV_Target
{
    float2 parallax=input.viewDirection.xy * normalMap.Sample( textureSampler, input.texcoord).a*bias;

    float4 D=textureMap.Sample( textureSampler, input.texcoord +parallax);
    float4 N=normalMap.Sample( textureSampler, input.texcoord +parallax)*2.0f-1.0f;

    return saturate(dot(N,input.lightDirection))*D+0.2F;
}

您可能想看看Catmull-Clark或loop子视频分割算法(第一个用于四边形网格,第二个用于三角形网格)。如果您使用的是DirectX 11,您还可以看看如何使用GPU的tesselation阶段来完成这类工作?我想你只是想要平滑的法线,我认为古罗阴影是正确的方向。我目前正在努力,但没有得到好的结果(我尝试使用没有法线反射的着色器。但结果很糟糕。我将上面的着色器代码更新为我的新着色器。可能有人知道我做错了什么。你可能想看看Catmull Clark或loop subvidision算法(第一个用于四网格,第二个用于三角形网格)。如果您使用的是DirectX 11,您也可以看看如何使用GPU的tesselation阶段来完成这类工作。您如何加载模型?我想您只需要平滑法线?我认为gouraud着色是正确的方向。我目前正在尝试,但没有得到好的结果(我尝试使用没有正常反射的着色器。但是结果很糟糕。我将上面的着色器代码更新为我的新着色器。可能有人知道我做错了什么。