我正在(重新)学习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存储为
或者-如果您对着色器没问题,则可以使用着色器“光线跟踪”天空盒。
关于c++ - HLSL和DX Skybox问题(创建接缝),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10461052/