/ / Amostragem de uma textura dentro do vertex shader - directx, hlsl, directx-11, sharpdx

Amostragem de uma textura dentro do shader de vértice? - directx, hlsl, directx-11, sharpdx

Estou usando o DirectX 11 visando o Shader Model 5 (bem, na verdade, usando o SharpDX para DirectX 11.2 build) e estou perdendo o que há de errado com esse shader simples que estou escrevendo.

O sombreador de pixel é aplicado em um poli alto e planoplano (para que haja muitos vértices a serem deslocados), a textura é amostrada sem problemas (o sombreador de pixels a exibe bem); no entanto, o deslocamento no sombreador de vértices simplesmente não funciona.

Não se trata de um problema de deslocamento,substituindo o + = height.SampleLevel por + = 0.5 mostra todos os vértices deslocados, não é um problema com a amostragem, pois o mesmo código funciona no pixel shader. E, tanto quanto eu entendo, não é um uso da API problema desde que ouvi SampleLevel (ao contrário da amostra) é perfeitamente utilizável no VS (desde que você forneça o nível de LOD).

Usando uma função de ruído para deslocar em vez de umtextura também funciona muito bem, o que me leva a pensar que o problema é com a amostragem de textura e apenas dentro do VS, o que é estranho, pois estou usando uma função que é supostamente compatível com o VS?

Eu tenho tentado coisas aleatórias na última horae eu realmente não sei onde procurar, também não encontro quase nenhuma informação sobre o mapeamento de deslocamento no hlsl e muito menos no DX11 + para usar como referência.

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

Para referência, caso seja importante:

Descrição da textura:

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

Descrição do amostrador:

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

Respostas:

2 para resposta № 1

Portanto, a resposta foi que Ronan não estava configurando a visualização de recurso do sombreador para o sombreador de vértices, para que ele pudesse acessar as texturas e definir os valores calculados.