置换着色器渲染问题(背面绘制在前面)

时间:2014-01-08 02:57:20

标签: directx shader hlsl directx-11 sharpdx

我正在使用sharpdx访问directX 11并运行我在单个平面上编写的这个非常简单的置换着色器

场景中没有多个位置,没有其他物体,只有一个带有置换着色器的高多边形平面在一次绘制调用中

虽然它首先渲染得很好但我随着时间的推移旋转它并且我得到“非常奇怪”的神器X2超过某个角度(这不是背面问题,我只是在向上轴上旋转它和它成角度的方式当问题出现时,没有可见的背面)

  • 某些区域似乎被吸引了(背面的多边形被抽到前面)你可以看到这里的样子:https://www.dropbox.com/s/hy4k20ay1g77rky/Drawing%20issue.png
  • 另一个完全不可理解的事情发生了,不确定我是否可以用文字传达它但是如果不清楚让我知道并且我将尝试捕捉视频:经过一定的旋转点就好像一条光线从屏幕上传来并“逐渐地” “从左到右重新塑造表面,在光线内留下奇怪的瑕疵,并使光线下方的几何体降低

我正在使用的着色器:

struct VS_IN
{
    float4 pos : POSITION;
    float2 tex : TEXCOORD;
};

struct PS_IN
{
    float4 pos : SV_POSITION;
    float2 tex : TEXCOORD;
};

float4x4 worldViewProj;

Texture2D<float4> diffuse: register(t0);
Texture2D<float4> height: register(t1);
Texture2D<float4> lightmap: register(t2);
SamplerState pictureSampler;

PS_IN VS( VS_IN input )
{
    PS_IN output = (PS_IN) 0;   
    input.pos.z += height.SampleLevel(pictureSampler, input.tex, 0).r /2;
    output.pos = mul(input.pos, worldViewProj);
    output.tex = input.tex;
    return output;
}

float4 PS( PS_IN input ) : SV_Target
{
    return diffuse.Sample(pictureSampler, input.tex) * lightmap.Sample(pictureSampler, input.tex);
}

1 个答案:

答案 0 :(得分:1)

看起来您没有正确设置深度测试。这可以解释为什么它从某些角度而不是从其他角度看起来是正确的,因为它取决于三角形的绘制顺序,而不是出现在顶部。

您是否创建了深度缓冲区,设置它,清除它并设置DepthStencilState以匹配?