2014-12-03 2 views
0

Я пытаюсь реализовать карту высот на основе GPU - самый простой (и самый быстрый) способ, которым я знаю как. Я передал текстуру (.png, D3DX11CreateShaderResourceViewFromFile()) в шейдер, и я пытаюсь пробовать ее для текущего значения пикселя. Видя float4, я в настоящее время назначаю значение цвета из канала для смещения значения y.Directx: Карта высот на основе HLSL. (Shader 5.0)

Texture2D colorMap : register(t0); 
SamplerState colorSampler : register(s0); 

... 

VOut VShader(float4 position : POSITION, float2 Texture : TEXCOORD0, float3 Normal : NORMAL) 
{ 
    VOut output; 

    float4 colors = colorMap.SampleLevel(colorSampler, float4(position.x*0.001, position.z*0.001, 0,0),0); 
    position.y = colors.x*128; 

    output.position = mul(position, WVP); 
    output.texture0 = Texture; 
    output.normal = Normal; 

    return output; 
} 

текстура импортируются правильно, и я вставил другую текстуру и был в состоянии успешно смешать текстуру с другой текстурой (путем умножения значений), так что я знаю, что float4 структура содержит значение своего рода способный выполнять на нем арифметику.

В функции Vertex, пытаясь извлечь значения ничего не дает на сетке: enter image description here

Концепция казалась достаточно просто на бумаге ...

ответ

1

Поскольку вы используете Texture2D, расположение параметр должен быть float2.

Кроме того, убедитесь, что местоположение идет от (0,0) до (1,1). Для правильного отображения сетки необходимо будет разместить от (0,0,0) до (1000,0,1000).

Если это так, то это должно работать:

SampleLevel(colorSampler, position.xz*0.001 ,0); 

Редактировать

Я любопытно, как вы проверяете это. Я попытался скомпилировать ваш код, добавив определения для VOut и WVP, и он не работает. Одна из ошибок - это параметр местоположения, который является float4 и должен быть float2. Другая ошибка, которую я получаю, - это имя функции; это должно быть главным.

Если вы используете Visual Studio, я настоятельно рекомендую использовать инструменты отладки графики и проверять все переменные. Я подозреваю, что текстура colorMap может быть привязана к пиксельному шейдеру, но не шейдеру вершин.

+0

Просто для подтверждения, я должен передавать координаты текстуры в параметр местоположения? или положение из вершины? (x, y). Пробовал оба, и это похоже на значение null. –

+0

Этот параметр представляет координату текстуры, но вы можете использовать любое значение float2, например, измененную позицию. Мне любопытно, как вы тестируете это. Я попытался скомпилировать ваш код, добавив определения для VOut и WVP, и он не работает. Одна из ошибок - это параметр местоположения, который является float4 и должен быть float2. Другая ошибка, которую я получаю, - это имя функции; это должно быть главным. –

+0

Vertex функция name может быть какой-либо предмет. По крайней мере, в компиляторе VS hlsl. Должен ли 'SampleLevel()' возвращать 'float4'? –

Смежные вопросы