Directx 在顶点着色器中采样纹理?
我使用的是DirectX 11目标着色器Model 5(实际上使用的是SharpDX for DirectX 11.2 build),我对我正在编写的这个简单着色器的错误感到困惑 像素着色器应用于平面高多边形平面(因此有大量顶点需要置换),纹理采样时没有问题(像素着色器显示得很好),但是顶点着色器中的置换不起作用 置换itsels没有问题,用+=0.5替换+=height.SampleLevel将显示所有置换的顶点,采样也没有问题,因为相同的代码在像素着色器中工作。据我所知,这不是API使用问题,因为我听说SampleLevel(与sample不同)在VS中完全可用(因为您提供了LOD级别) 使用噪波函数代替纹理也可以很好地工作,这让我认为问题在于纹理采样,并且只在VS内部,这很奇怪,因为我使用的是一个假设与VS兼容的函数 在过去的一个小时里,我一直在尝试一些随机的事情,我真的不知道该去哪里找,我在hlsl中几乎找不到关于位移贴图的信息,在DX11+中更是找不到用作参考的信息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使用问题
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
});