微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将像素着色器 asm 转换为 HLSL

如何解决将像素着色器 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 举报,一经查实,本站将立刻删除。