C++ Directx:HLSL基于纹理的高度贴图。(着色器5.0)

C++ Directx:HLSL基于纹理的高度贴图。(着色器5.0),c++,directx-11,hlsl,vertex-shader,heightmap,C++,Directx 11,Hlsl,Vertex Shader,Heightmap,我正试图以我所知道的最简单(最快)的方式实现一个基于GPU的高度图。我将(.png,D3DX11CreateShaderResourceViewFromFile())纹理传递到着色器中,并尝试对其进行采样以获取当前像素值。看到一个float4,我当前正在从通道分配一个颜色值,以偏移y值 Texture2D colorMap : register(t0); SamplerState colorSampler : register(s0); ... VOut VShader(float4 pos

我正试图以我所知道的最简单(最快)的方式实现一个基于GPU的高度图。我将(.png,
D3DX11CreateShaderResourceViewFromFile()
)纹理传递到着色器中,并尝试对其进行采样以获取当前像素值。看到一个
float4
,我当前正在从通道分配一个颜色值,以偏移
y

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函数中,尝试提取值不会在网格上产生任何结果:


这个概念在纸上看起来很简单…

因为您使用的是Texture2D,所以位置参数必须是float2

另外,确保位置从(0,0)到(1,1)。为了使映射正确,需要将栅格放置在(0,0,0)到(1000,01000)之间

如果是这种情况,那么这应该起作用:

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

我很好奇你是如何测试这个的。我尝试编译您的代码,添加了VOut和WVP的定义,但失败了。错误之一是位置参数是float4,应该是float2。我得到的另一个错误是函数名;它应该是主要的


如果您碰巧正在使用VisualStudio,我强烈建议您使用图形调试工具并检查所有变量。我怀疑colorMap纹理可能绑定到像素着色器,而不是顶点着色器。

为了确认,我应该将纹理坐标传递到位置参数?或者从顶点开始的位置?(x,y)。这两种方法都试过了,就像值为null一样。该参数表示纹理坐标,但您可以使用任何想要的float2,例如修改的位置。我很好奇你是如何测试这个的。我尝试编译您的代码,添加了VOut和WVP的定义,但失败了。错误之一是位置参数是float4,应该是float2。我得到的另一个错误是函数名;它应该是main。顶点函数名可以是任何东西。至少在VS hlsl编译器中。是否应
SampleLevel()
返回
float4
?xD您是我的新朋友。纹理没有绑定到顶点着色器,这就是为什么我的值像NaN或怪异。