问题描述
我正在尝试将内联 asm ps_1_3 pixelshader 转换回 HLSL,但我被困在一条找不到任何文档的指令上。指令是 +mov
,而这样的修饰符没有在 modifiers 中列出。我将它翻译成一个简单的任务,但渲染的场景看起来不一样了。也许我的其他翻译也是错误的。
完整的汇编代码:
Sampler[0] = (DiffuseMapSampler);
pixelShader = asm
{
ps_1_3
tex t0
#ifdef _POINTLIGHT_
add r0.rgb,v0,v0
+mov r0.a,v0.a
mul_x4 r0,t0,r0
#else
mul_x4 r0,v0
#endif
#if defined(OVERGROWTH) && HASALPHA2MASK
mul_x2 r0.a,r0.a,t0.a
#endif
};
结构和采样器
struct VS_OUTPUT
{
float4 Pos : POSITION0;
float2 Tex0 : TEXCOORD0;
#if _HASSHADOW_
float4 TexShadow : TEXCOORD1;
#endif
float4 Color : COLOR0;
float Fog : FOG;
};
texture DiffuseMap;
sampler DiffuseMapSampler = sampler_state
{
Texture = (DiffuseMap);
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
AddressU = WRAP;
AddressV = WRAP;
MipMapLodBias = 0;
};
我的 HLSL 翻译
float4 basicPixelShaderNoShadow(VS_OUTPUT VsOut) : COLOR
{
float4 diffuseMap = tex2D(DiffuseMapSampler,VsOut.Tex0);
float4 outCol;
#ifdef _POINTLIGHT_
outCol.rgb = VsOut.Color.rgb * 2;
outCol.a = VsOut.Color.a;
outCol = diffuseMap * outCol * 4;
#else
outCol = diffuseMap * VsOut.Color * 4;
#endif
#if defined(OVERGROWTH) && HASALPHA2MASK
outCol.a *= 2 * diffuseMap.a;
#endif
return outCol;
}
解决方法
+mov
表示“并行”。为它找到了一个例子 here。渲染的差异来自ps版本的变化。 HLSL 设置为 ps_2_a,当使用 ps_1_3 时,一切都与 asm 相同。