来自 bool 的 Shader intrinsic asfloat 消失了吗?
Shader intrinsic asfloat from bool disappeared?
正在编译此像素着色器:
float4 main() : SV_TARGET
{
bool4 b = bool4(true, false, true, false);
return asfloat(b);
}
使用命令 fxc.exe test.hlsl /T ps_5_0
失败:
Microsoft (R) Direct3D Shader Compiler 6.3.9600.16384 (using C:\Program Files (x86)\Windows Kits.1\bin\x64\D3DCOMPILER_47.dll)
Copyright (C) 2013 Microsoft. All rights reserved.
test.hlsl(13,12-21): error X3013: 'asfloat': no matching 1 parameter intrinsic function
test.hlsl(13,12-21): error X3013: Possible intrinsic functions are:
test.hlsl(13,12-21): error X3013: asfloat(float|half|int|uint)
compilation failed; no code produced
虽然它适用于旧版本的着色器编译器:
"C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Utilities\bin\x64\fxc.exe" /T ps_5_0 test.hlsl
Microsoft (R) Direct3D Shader Compiler 9.29.952.3111
Copyright (C) Microsoft Corporation 2002-2009. All rights reserved.
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
//
//
// fxc /T ps_5_0 a.hlsl
//
//
//
// Input signature:
//
// Name Index Mask Register SysValue Format Used
// -------------------- ----- ------ -------- -------- ------ ------
// no Input
//
// Output signature:
//
// Name Index Mask Register SysValue Format Used
// -------------------- ----- ------ -------- -------- ------ ------
// SV_TARGET 0 xyzw 0 TARGET float xyzw
//
ps_5_0
dcl_globalFlags refactoringAllowed
dcl_output o0.xyzw
mov o0.xyzw, l(1.000000,0,1.000000,0)
ret
// Approximately 2 instruction slots used
MSDN page on asfloat 没有提及此更改,并列出了 bool
重载。
这是一个错误吗?难道我做错了什么?这个内在的是故意删除的吗?我应该用什么代替? (我其实是和asfloat(all(...))
结合使用的。)
asfloat(bool)
应该永远不会起作用。 asfloat
(和 asdouble
)本质上是 *reinterpret_cast<float*>(&x)
的 HLSL 等价物。这对整数数据有一定意义,但 bool 是有问题的。 bool 的位域模式在 HLSL 中定义不明确,因此理论上它可以是任何东西。
编译器在 Windows 8 时代的某处更新(即 post DirectX SDK 根据 MSDN 被声明为遗留)到 "fix" 此行为。 D3DCompiler DLL 的 #43 遗留 DirectX SDK 版本是最后一个接受布尔值 asfloat
的编译器。
MSDN 页面从未更新以反映这一点,因此我已提交文档错误以更正该错误。
正在编译此像素着色器:
float4 main() : SV_TARGET
{
bool4 b = bool4(true, false, true, false);
return asfloat(b);
}
使用命令 fxc.exe test.hlsl /T ps_5_0
失败:
Microsoft (R) Direct3D Shader Compiler 6.3.9600.16384 (using C:\Program Files (x86)\Windows Kits.1\bin\x64\D3DCOMPILER_47.dll)
Copyright (C) 2013 Microsoft. All rights reserved.
test.hlsl(13,12-21): error X3013: 'asfloat': no matching 1 parameter intrinsic function
test.hlsl(13,12-21): error X3013: Possible intrinsic functions are:
test.hlsl(13,12-21): error X3013: asfloat(float|half|int|uint)
compilation failed; no code produced
虽然它适用于旧版本的着色器编译器:
"C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Utilities\bin\x64\fxc.exe" /T ps_5_0 test.hlsl
Microsoft (R) Direct3D Shader Compiler 9.29.952.3111
Copyright (C) Microsoft Corporation 2002-2009. All rights reserved.
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
//
//
// fxc /T ps_5_0 a.hlsl
//
//
//
// Input signature:
//
// Name Index Mask Register SysValue Format Used
// -------------------- ----- ------ -------- -------- ------ ------
// no Input
//
// Output signature:
//
// Name Index Mask Register SysValue Format Used
// -------------------- ----- ------ -------- -------- ------ ------
// SV_TARGET 0 xyzw 0 TARGET float xyzw
//
ps_5_0
dcl_globalFlags refactoringAllowed
dcl_output o0.xyzw
mov o0.xyzw, l(1.000000,0,1.000000,0)
ret
// Approximately 2 instruction slots used
MSDN page on asfloat 没有提及此更改,并列出了 bool
重载。
这是一个错误吗?难道我做错了什么?这个内在的是故意删除的吗?我应该用什么代替? (我其实是和asfloat(all(...))
结合使用的。)
asfloat(bool)
应该永远不会起作用。 asfloat
(和 asdouble
)本质上是 *reinterpret_cast<float*>(&x)
的 HLSL 等价物。这对整数数据有一定意义,但 bool 是有问题的。 bool 的位域模式在 HLSL 中定义不明确,因此理论上它可以是任何东西。
编译器在 Windows 8 时代的某处更新(即 post DirectX SDK 根据 MSDN 被声明为遗留)到 "fix" 此行为。 D3DCompiler DLL 的 #43 遗留 DirectX SDK 版本是最后一个接受布尔值 asfloat
的编译器。
MSDN 页面从未更新以反映这一点,因此我已提交文档错误以更正该错误。