如何解决将像素着色器 asm 转换为 HLSL
我正在尝试将内联 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 相同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。