【问题标题】:Having trouble converting a d3d9 pixelshader to d3d11将 d3d9 像素着色器转换为 d3d11 时遇到问题
【发布时间】:2020-11-23 08:58:51
【问题描述】:

我有一个我正在尝试转换的像素着色器。我已经更正了 d3d11 的所有语法,但是当我通过生成 .fxc 文件的编译器运行 HLSL 文件时,它给了我这个错误:

warning X3206: 'dot': implicit truncation of vector type

请注意,我根本不精通这些东西。

这是代码。

// Global variables
Texture2D<float4> img;
sampler imgSampler;

Texture2D<float4> bkd : register(t1);
sampler bkdSampler : register(s1);

cbuffer PS_VARIABLES : register(b0)
{
int lightAenabled, lightBenabled, lightCenabled;
float4 lightAColor, lightBColor, lightCColor, ambientLight;
float lightAX, lightBX, lightCX;
float lightAY, lightBY, lightCY;
float lightAZ, lightBZ, lightCZ;
float lightABrightness, lightBBrightness, lightCBrightness;
float objX, objY;

};

cbuffer PS_PIXELSIZE : register(b1)
{
float fPixelWidth;
float fPixelHeight;
};


float4 ps_main(in float2 texCoord : TEXCOORD ) : SV_TARGET
{
    float4 normal = img.Sample(imgSampler, texCoord);
    normal = float4(normal.x - 0.5, normal.y - 0.5, normal.z - 0.5, normal.w);
    float4 background = bkd.Sample(bkdSampler, texCoord);
    float4 color = float4(0,0,0,normal.a);
    float3 pixelPos = float3(texCoord.xy,0);
    float3 objPos = float3(objX,objY,0);
    float3 lightPos;
    float3 dir;
    float dist, amount;
    
    

    if(lightAenabled)
    {
        
        lightPos = float3((lightAX-objX)*fPixelWidth+0.5,(lightAY-objY)*fPixelHeight+0.5,lightAZ);
        dir = normalize(lightPos - pixelPos);
        dist = 1/length(lightPos - pixelPos);
        float3 amount = (normal, dir);
        color.rgb += amount * lightABrightness * dist * lightAColor.rgb;
    }
    
    if(lightBenabled)
    {
        lightPos = float3((lightBX-objX)*fPixelWidth+0.5,(lightBY-objY)*fPixelHeight+0.5,lightBZ);
        dir = normalize(lightPos - pixelPos);
        dist = 1/length(lightPos - pixelPos);
         amount = saturate(dot(normal,dir));
        color.rgb += amount * lightBBrightness * dist * lightBColor.rgb;
    }
    
    if(lightCenabled)
    {
        lightPos = float3((lightCX-objX)*fPixelWidth+0.5,(lightCY-objY)*fPixelHeight+0.5,lightCZ);
        dir = normalize(lightPos - pixelPos);
        dist = 1/length(lightPos - pixelPos);
        amount = saturate(dot(normal,dir));
        color.rgb += amount * lightCBrightness * dist * lightCColor.rgb;
    }

    return float4(ambientLight.rgb,0) + color * background;
};



float4 Demultiply(float4 _color)
{
float4 color = _color;
    if ( color.a != 0 )
        color.rgb /= color.a;
    return color;
}



float4 ps_main_pm(in float2 texCoord : TEXCOORD ) : SV_TARGET
{
    float4 normal = Demultiply(img.Sample(imgSampler, texCoord));
    normal = float4(normal.x-0.5, normal.y-0.5, normal.z-0.5, normal.w);
    float4 background = Demultiply(bkd.Sample(bkdSampler, texCoord));
    float4 color = float4(0,0,0,normal.a);
    float4 O = float4(ambientLight.rgb, 0) + color * background;
    float3 pixelPos = float3(texCoord.xy,0);
    float3 objPos = float3(objX,objY,0);
    float3 lightPos, dir;
    float dist, amount; 
    


    if(lightAenabled)
    {
        lightPos = float3((lightAX-objX)*fPixelWidth+0.5,(lightAY-objY)*fPixelHeight+0.5,lightAZ);
        dir = normalize(lightPos - pixelPos);
        dist = 1/length(lightPos - pixelPos);
        amount = saturate(dot(normal,dir));
        color.rgb += amount * lightABrightness * dist * lightAColor.rgb;
    }
    
    if(lightBenabled)
    {
        lightPos = float3((lightBX-objX)*fPixelWidth+0.5,(lightBY-objY)*fPixelHeight+0.5,lightBZ);
        dir = normalize(lightPos - pixelPos);
        dist = 1/length(lightPos - pixelPos);
        amount = saturate(dot(normal,dir));
        color.rgb += amount * lightBBrightness * dist * lightBColor.rgb;
    }
    
    if(lightCenabled)
    {
        lightPos = float3((lightCX-objX)*fPixelWidth+0.5,(lightCY-objY)*fPixelHeight+0.5,lightCZ);
        dir = normalize(lightPos - pixelPos);
        dist = 1/length(lightPos - pixelPos);
        amount = saturate(dot(normal,dir));
        color.rgb += amount * lightCBrightness * dist * lightCColor.rgb;
    }

    O.rgb *= O;
    return O;
    
};

【问题讨论】:

    标签: shader hlsl direct3d direct3d11 pixel-shader


    【解决方案1】:

    normal 是一个 4 向量。 dir 是一个 3 向量。 点积只对相同长度的向量有效。

    在这种情况下,normal.a 是“普通纹理”中的其他值,因此您可以使用源寄存器掩码/swizzling 将其转换为 3 向量,这就是隐式发生的事情:

    amount = saturate(dot(normal.xyz,dir));
    

    normal.rgbnormal.xyz 会做同样的事情。

    【讨论】:

    • 啊,好的,谢谢。现在编译器吐出 fxc 没有任何错误,但着色器现在完全是黑色的。你会碰巧知道这是为什么吗?如果需要,我可以发布原始 d3d9 代码。
    • 图形调试具有挑战性。任何数量的错误都可能导致黑屏。我能给你的最好建议是从一个工作案例开始,一次添加一件事。确保您启用了debug device,并检查所有HRESULT 返回值是否成功/失败。您可能还想看看DirectX Tool Kit for DX11
    猜你喜欢
    • 2019-11-03
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 2014-02-28
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多