我正在(重新)学习DirectX,并且已经开始使用HLSL编码。在使用自定义.fx文件之前,我为具有四边形顶点缓冲区的游戏创建了一个天空盒。一切都很好...纹理映射并包装精美。但是,现在我有了HLSL设置来管理顶点,在四边形相交处有独特的接缝。所有的纹理都正确排列,我只是不能摆脱这个该死的缝!

我倾向于认为问题出在texCube ...或者更确切地说是这里的所有纹理信息。我正在DX中对四边形进行纹理化...可能只是我仍然不太了解两者之间的联系..不确定。无论如何,感谢您的提前帮助!

这是.fx文件:

float4x4 World;
float4x4 View;
float4x4 Projection;

float3 CameraPosition;

Texture SkyBoxTexture;

samplerCUBE SkyBoxSampler = sampler_state
{
   texture = <SkyBoxTexture>;
   minfilter = ANISOTROPIC;
   mipfilter = LINEAR;
   AddressU = Wrap;
   AddressV = Wrap;
   AddressW = Wrap;
};

struct VertexShaderInput
{
    float4 Position : POSITION0;
};

struct VertexShaderOutput
{
    float4 Position : POSITION0;
    float3 TextureCoordinate : TEXCOORD0;
};

VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
    VertexShaderOutput output;

    float4 worldPosition = mul(input.Position, World);
    float4 viewPosition = mul(worldPosition, View);
    output.Position = mul(viewPosition, Projection);

    float4 VertexPosition = mul(input.Position, World);
    output.TextureCoordinate = VertexPosition - CameraPosition;

    return output;
}

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
    return texCUBE(SkyBoxSampler, normalize(input.TextureCoordinate));
}

technique Skybox
{
    pass Pass1
    {
        VertexShader = compile vs_2_0 VertexShaderFunction();
        PixelShader = compile ps_2_0 PixelShaderFunction();
    }
}

最佳答案

为了避免接缝,您需要在单个DrawIndexedPrimitive调用中绘制天空盒,最好使用三角带。不要将每个面孔绘制为用单独矩阵或类似形式转换的单独图元,否则会出现接缝。如果出于某种无法解释的原因,不想对天空盒零件使用单个DrawIndexedPrimitive调用,则必须确保使用相同的矩阵(每个调用中使用的相同的世界+ View +投影矩阵)以及相同的角坐标值绘制所有面顶点-即“顶”面应为“侧”面使用的角使用完全相同的 vector (位置)。

另一件事是您应该将skybox存储为

  • cubemap(看起来就是您正在做的事情)-仅为skybox制作8个顶点,将它们绘制为索引图元。
  • 或已填充未使用区域的未包装“ map 集”纹理。带有边框颜色。

  • 或者-如果您对着色器没问题,则可以使用着色器“光线跟踪”天空盒。

    关于c++ - HLSL和DX Skybox问题(创建接缝),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10461052/

    10-11 23:23