2014-01-05 5 views
4

Я использую 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 
      }); 
+0

Я предполагаю, что вы делаете 2 прохода ... На вашем втором проходе вы снова визуализируете текстуру? Это звучит как проблема с выпуском вывода. – Miguel

+0

Нет, не делает 2 прохода, только 1 шейдер и 1 ничего не пропускают. –

+0

Также я никогда не перерисовываю текстуру для начала, это статическая текстура, загруженная из файла, она никогда не меняется –

ответ

2

Таким образом, ответ был, что Ронан не было настройки шейдера представление ресурсов в шейдер вершин, чтобы он мог получить доступ к текстурам и установить рассчитанные значения.