none
HLSL + C++

    Вопрос

  • Обычно пишу эффекты на HLSL + С#(VS2012). Недавно одолжил приятелю(он пишет на С++ и изучает HLSL) один простенький пример(отражение):

    float4x4 w;
    float4x4 v;
    float4x4 p;
    float4 cp;
    texture tx;
    sampler stx = sampler_state
    {
        texture = <tx>;
        mipfilter = LINEAR;
        magfilter = LINEAR;
        minfilter = LINEAR;	
    };
    float pi = 3.14159;
    
    struct VI
    {
        float4 pos : POSITION;
        float4 normal : NORMAL;
    };
    
    struct PI
    {
        float4 pos : POSITION;
        float4 normal : TEXCOORD0;
        float4 posw : TEXCOORD1;
    };
    
    // Код вершинного шейдера
    PI VS(VI IN)
    {
        PI OUT;
        OUT.pos = mul(mul(IN.pos, v), p);
        OUT.posw = IN.pos;
        OUT.normal = IN.normal;
        return OUT;
    }
    
    // Код пиксельного шейдера
    float4 PS(PI IN) : COLOR
    {
        float3 cpt = IN.posw - cp;
        float3 ref = normalize(reflect(cpt, IN.normal.xyz));
        float2 refxy = normalize(ref.xy);
        float2 tc; //Текстурные координаты
        tc.x = (refxy.y < 0) ? acos(refxy.x) / pi / 2 + 0.5 : 0.5 - acos(refxy.x) / pi / 2;
        tc.y = 0.5 - asin(ref.z) / pi;
        return tex2D(stx, tc);
    }
    
    technique Main
    {
        pass p0 
        {
    	VertexShader = compile vs_2_0 VS();
    	PixelShader = compile ps_2_0 PS();
        }
    }

    У меня все работало правильно(C# + HLSL), а у него(C++ + HLSL) работает, но с искажениями.

    Начал разбираться, - оказалось строчка:

    float2 refxy = normalize(ref.xy);
    
     

    не работает (не нормализует). Пришлось городить огород:

    float lrxy = pow(ref.x * ref.x + ref.y * ref.y, 0.5);
    float2 refxy = float2(ref.x / lrxy, ref.y /lrxy);
    

    Вопрос: в чем причина?

    От версии VS это не зависит. Пробовал на VS2017, - результат одинаковый.

    Может что в настройках?

    13 февраля 2018 г. 9:40