【问题标题】:Directx: HLSL Texture based height map. (Shader 5.0)Directx:基于 HLSL 纹理的高度图。 (着色器 5.0)
【发布时间】:2014-12-03 02:49:17
【问题描述】:

我正在尝试以我所知道的最简单(也是最快)的方式实现基于 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 函数中,尝试提取值不会在网格上产生任何结果:

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

【问题讨论】:

    标签: c++ directx-11 hlsl vertex-shader heightmap


    【解决方案1】:

    由于您使用的是 Texture2D,因此 Location 参数需要是 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 纹理可能绑定到像素着色器,但没有绑定到顶点着色器。

    【讨论】:

    • 确认一下,我应该将纹理坐标传递给位置参数?或从顶点的位置?(x,y)。两者都试过了,好像值是空的。
    • 那个参数代表一个纹理坐标,但是你可以使用任何你想要的float2,比如修改后的位置。我很好奇你是如何测试这个的。我尝试编译您的代码,并添加了 VOut 和 WVP 的定义,但它失败了。其中一个错误是位置参数是 float4,应该是 float2。我得到的另一个错误是函数的名称;它应该是主要的。
    • 顶点函数名可以是任何东西。至少在 VS hlsl 编译器中。 SampleLevel()应该返回float4吗?
    • xD 你是我的新朋友。纹理未绑定到顶点着色器,这就是为什么我的值类似于 NaN 或奇怪的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    相关资源
    最近更新 更多