gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:41:32 25 4
gpt4 key购买 nike

我正在使用针对 Shader Model 5 的 DirectX 11(实际上是使用 SharpDX 进行 directx 11.2 构建),但我对我正在编写的这个简单着色器有什么问题感到困惑。

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

这不是位移本身的问题,用 += 0.5 替换 += height.SampleLevel 会显示所有位移的顶点,这也不是采样的问题,因为相同的代码在像素着色器中工作。据我了解,这不是 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
});

最佳答案

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

关于directx - 在顶点着色器中采样纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20940639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com