Я использую DirectX 11, ориентируясь на Shader Model 5 (ну, фактически, используя SharpDX для сборки DirectX 11.2), и я теряю то, что не так с этим простым шейдером, который я пишу.Выборка текстуры в вершинном шейдере?
Пиксельный шейдер применяется на плоской высокой полиплоскости (поэтому есть множество вершин для замещения), текстура отбирается без проблем (пиксельный шейдер отображает ее в порядке), однако смещение в вершинном шейдере просто не выполняется Не работай.
Это не проблема со смещением, заменяя + = 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;
}
Для справки в случае, если это имеет значение: описание
Texture:
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),
};
Sampler описание:
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
});
Я предполагаю, что вы делаете 2 прохода ... На вашем втором проходе вы снова визуализируете текстуру? Это звучит как проблема с выпуском вывода. – Miguel
Нет, не делает 2 прохода, только 1 шейдер и 1 ничего не пропускают. –
Также я никогда не перерисовываю текстуру для начала, это статическая текстура, загруженная из файла, она никогда не меняется –