这是一个计算着色器,但我认为这是一个普遍的问题。这是一个片段:
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:'获取':无法从'const Texture2D'隐式转换为'Texture2D'
答案 0 :(得分: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
)。