Directx 在顶点着色器中采样纹理?

Directx 在顶点着色器中采样纹理?,directx,hlsl,directx-11,sharpdx,Directx,Hlsl,Directx 11,Sharpdx,我使用的是DirectX 11目标着色器Model 5(实际上使用的是SharpDX for DirectX 11.2 build),我对我正在编写的这个简单着色器的错误感到困惑 像素着色器应用于平面高多边形平面(因此有大量顶点需要置换),纹理采样时没有问题(像素着色器显示得很好),但是顶点着色器中的置换不起作用 置换itsels没有问题,用+=0.5替换+=height.SampleLevel将显示所有置换的顶点,采样也没有问题,因为相同的代码在像素着色器中工作。据我所知,这不是API使用问题

我使用的是DirectX 11目标着色器Model 5(实际上使用的是SharpDX for DirectX 11.2 build),我对我正在编写的这个简单着色器的错误感到困惑

像素着色器应用于平面高多边形平面(因此有大量顶点需要置换),纹理采样时没有问题(像素着色器显示得很好),但是顶点着色器中的置换不起作用

置换itsels没有问题,用+=0.5替换+=height.SampleLevel将显示所有置换的顶点,采样也没有问题,因为相同的代码在像素着色器中工作。据我所知,这不是API使用问题,因为我听说SampleLevel(与sample不同)在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;
}
取样器说明:

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
            });

因此,答案是Ronan没有将着色器资源视图设置为顶点着色器,以便它可以访问纹理并设置计算值。

I;我假设你做了两次传球。。。在第二遍中,是否再次渲染纹理?这听起来像是一个输出合并问题。不,不做2次,只做1次着色器&1次不做其他任何操作。而且我从一开始就不会重新渲染纹理,它是从文件加载的静态纹理,它永远不会更改。我看到了。我对sharpdx不是很有经验,但您可以尝试实现GS或CS来执行此计算,可能您正在处理驱动程序错误…您是否允许像素着色器访问纹理?您是否使用PIX或visual studio进行了一些hlsl调试?
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
            });