1

这是在计算着色器中,但我认为这是一般的 hlsl 事情。这是一个片段:

Texture2D<float> Ground : register(t1);
Texture2D<float> Water : register(t2);

SamplerState LinearSampler
{
    Filter = MIN_MAG_MIP_LINEAR;
    AddressU = Clamp;
    AddressV = Clamp;
};

float4 Get(Texture2D source, float x, float y)
{
    return source.SampleLevel(LinearSampler, float2(x * dimension.z, y * dimension.w), 0);
}

[numthreads(32, 32, 1)]
void main(uint3 threadID : SV_DispatchThreadID, uint3 groupThreadID : SV_GroupThreadID, uint3 blockID : SV_GroupID)
{
    float4 g = GetGround(Ground, 0, 0);

    Output[threadID.xy] = g.z;
}

对 Get 方法的任何调用都会给我:

错误 X3017:“Get”:无法从“const Texture2D”隐式转换为“Texture2D”

4

1 回答 1

0

我假设您缺少代码标签导致尖括号被省略。错误应该是error X3017: 'Get': cannot implicitly convert from 'const Texture2D<float>' to 'Texture2D<float4>'对的?这是有道理的,因为Texture2D它是隐式Texture2D<float4>的(4 通道),而您的全局纹理是Texture2D<float>(单通道)。编译器不会隐式扩展类型(尽管它会截断并显示警告)。这与它是 Texture2D 还是普通的旧 float4 无关。要修复您的代码,您应该确保您的源纹理确实是单通道的,然后使函数参数匹配(即Texture2D<float> source)。

于 2013-11-05T18:38:46.230 回答