2014-01-05 49 views
4

我正在使用针对Shader Model 5的DirectX 11(实际上使用SharpDX for directx 11.2版本),并且我对这个简单着色器写错了有什么问题。在顶点着色器中抽样纹理?

像素着色器应用在平坦的高多边形平面上(因此有很多顶点要移位),纹理采样时没有问题(像素着色器显示正常),但是顶点着色器中的位移只是不会没有工作。

这不是一个与位移itsels的问题,用+ = height.SampleLevel替换+ = 0.5显示所有顶点移位,这不是取样的问题,因为在像素着色器中工作的代码相同。据我所知,这不是一个API使用问题,因为我听到SampleLevel(不像样本)在VS中是完全可用的(因为你提供了LOD级别)。

使用噪声函数代替纹理也可以工作得很好,这导致我认为问题与纹理采样有关,而且仅在VS内部,这很奇怪,因为我使用的是一个函数, VS兼容?

我一直在尝试随机的东西过去一小时,我真的很无知,在哪里看,我也发现几乎没有关于位移映射在hlsl中的信息,甚至更少,因此在DX11 +中用作参考。

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; 
    output.pos = mul(input.pos, worldViewProj); 
    output.tex = input.tex; 
    return output; 
} 

float4 PS(PS_IN input) : SV_Target 
{ 
    return height.SampleLevel(pictureSampler, input.tex, 0).rrrr; 
} 

作为参考的情况下,它的问题:

纹理描述:

new SharpDX.Direct3D11.Texture2DDescription() 
      { 
       Width = bitmapSource.Size.Width, 
       Height = bitmapSource.Size.Height, 
       ArraySize = 1, 
       BindFlags = SharpDX.Direct3D11.BindFlags.ShaderResource , 
       Usage = SharpDX.Direct3D11.ResourceUsage.Immutable, 
       CpuAccessFlags = SharpDX.Direct3D11.CpuAccessFlags.None, 
       Format = SharpDX.DXGI.Format.R8G8B8A8_UNorm, 
       MipLevels = 1, 
       OptionFlags = SharpDX.Direct3D11.ResourceOptionFlags.None, 
       SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0), 
      }; 

取样说明:

var sampler = new SamplerState(device, new SamplerStateDescription() 
      { 
       Filter = Filter.MinMagMipLinear, 
       AddressU = TextureAddressMode.Clamp, 
       AddressV = TextureAddressMode.Clamp, 
       AddressW = TextureAddressMode.Clamp, 
       BorderColor = Color.Pink, 
       ComparisonFunction = Comparison.Never, 
       MaximumAnisotropy = 16, 
       MipLodBias = 0, 
       MinimumLod = 0, 
       MaximumLod = 16 
      }); 
+0

我; m假设你正在做2遍......在你的第二遍是你再次渲染纹理?这听起来像一个输出合并问题。 – Miguel

+0

不要做2遍,只有1个着色器&1没有其他的通过。 –

+0

另外我从来没有重新初始化纹理,它是从文件加载的静态纹理,它从不改变我看到的 –

回答

2

所以答案是罗南没有设置着色器资源视图到顶点着色器,以便它可以访问纹理并设置计算值。

相关问题