Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xna xbox上的像素着色器性能_Xna_Hlsl_Xna 4.0_Xbox360_Pixel Shader - Fatal编程技术网

Xna xbox上的像素着色器性能

Xna xbox上的像素着色器性能,xna,hlsl,xna-4.0,xbox360,pixel-shader,Xna,Hlsl,Xna 4.0,Xbox360,Pixel Shader,我有一个像素着色器(下图),我正在使用XNA。在我的笔记本电脑(蹩脚的显卡)上,它运行时有点不平稳,但正常。我刚刚试着在xbox上运行它,太可怕了 游戏中没有任何东西(它只是一个分形渲染器),所以它必须是导致问题的像素着色器。我还认为这是PS代码,因为我已经降低了迭代次数,而且还可以。我也检查过了,GC增量为零 xbox上是否有任何HLSL功能不可用??我肯定是做错了什么,表演不会那么差吧 #include "FractalBase.fxh" float ZPower; float3 Col

我有一个像素着色器(下图),我正在使用XNA。在我的笔记本电脑(蹩脚的显卡)上,它运行时有点不平稳,但正常。我刚刚试着在xbox上运行它,太可怕了

游戏中没有任何东西(它只是一个分形渲染器),所以它必须是导致问题的像素着色器。我还认为这是PS代码,因为我已经降低了迭代次数,而且还可以。我也检查过了,GC增量为零

xbox上是否有任何HLSL功能不可用??我肯定是做错了什么,表演不会那么差吧

#include "FractalBase.fxh"

float ZPower;

float3 Colour;
float3 ColourScale;

float ComAbs(float2 Arg)
{
    return sqrt(Arg.x * Arg.x + Arg.y * Arg.y);
}

float2 ComPow(float2 Arg, float Power)
{
    float Mod = pow(Arg.x * Arg.x + Arg.y * Arg.y, Power / 2);
    float Ang = atan2(Arg.y, Arg.x) * Power;

    return float2(Mod * cos(Ang), Mod * sin(Ang));
}

float4 FractalPixelShader(float2 texCoord : TEXCOORD0, uniform float Iterations) : COLOR0
{
    float2 c = texCoord.xy;
    float2 z = 0;

    float i;

    float oldBailoutTest = 0;
    float bailoutTest = 0;

    for(i = 0; i < Iterations; i++)
    {
        z = ComPow(z, ZPower) + c;

        bailoutTest = z.x * z.x + z.y * z.y;

        if(bailoutTest >= ZPower * ZPower)
        {
            break;
        }

        oldBailoutTest = bailoutTest;
    }

    float normalisedIterations = i / Iterations;
    float factor = (bailoutTest - oldBailoutTest) / (ZPower * ZPower - oldBailoutTest);

    float4 Result = normalisedIterations + (1 / factor / Iterations);

    Result = (i >= Iterations - 1) ? float4(0.0, 0.0, 0.0, 1.0) : float4(Result.x * Colour.r * ColourScale.x, Result.y * Colour.g * ColourScale.y, Result.z * Colour.b * ColourScale.z, 1);

    return Result;
}

technique Technique1
{
    pass
    {
        VertexShader = compile vs_3_0 SpriteVertexShader();
        PixelShader = compile ps_3_0 FractalPixelShader(128);
    }
}
编辑我确实尝试过使用大量LERP删除条件,但是当我这样做时,我得到了大量的工件(而不是那种“!”的工件)。我改变了一些情况,修复了一些逻辑错误,但关键是将大于1的结果乘以1+ε,以解释舍入错误,使0.9999=0(整数)。请参阅下面的固定代码:

#include "FractalBase.fxh"

float ZPower;

float3 Colour;
float3 ColourScale;

float ComAbs(float2 Arg)
{
    return sqrt(Arg.x * Arg.x + Arg.y * Arg.y);
}

float2 ComPow(float2 Arg, float Power)
{
    float Mod = pow(Arg.x * Arg.x + Arg.y * Arg.y, Power / 2);
    float Ang = atan2(Arg.y, Arg.x) * Power;

    return float2(Mod * cos(Ang), Mod * sin(Ang));
}

float GreaterThan(float x, float y)
{
    return ((x - y) / (2 * abs(x - y)) + 0.5) * 1.001;
}

float4 FractalPixelShader(float2 texCoord : TEXCOORD0, uniform float Iterations) : COLOR0
{
    float2 c = texCoord.xy;
    float2 z = 0;

    int i;

    float oldBailoutTest = 0;
    float bailoutTest = 0;

    int KeepGoing = 1;

    int DoneIterations = Iterations;

    int Bailout = 0;

    for(i = 0; i < Iterations; i++)
    {
        z = lerp(z, ComPow(z, ZPower) + c, KeepGoing);

        bailoutTest = lerp(bailoutTest, z.x * z.x + z.y * z.y, KeepGoing);

        Bailout = lerp(Bailout, GreaterThan(bailoutTest, ZPower * ZPower), -abs(Bailout) + 1);

        KeepGoing = lerp(KeepGoing, 0.0, Bailout);
        DoneIterations = lerp(DoneIterations, min(i, DoneIterations), Bailout);

        oldBailoutTest = lerp(oldBailoutTest, bailoutTest, KeepGoing);
    }

    float normalisedIterations = DoneIterations / Iterations;
    float factor = (bailoutTest - oldBailoutTest) / (ZPower * ZPower - oldBailoutTest);

    float4 Result = normalisedIterations + (1 / factor / Iterations);

    Result = (DoneIterations >= Iterations - 1) ? float4(0.0, 0.0, 0.0, 1.0) : float4(Result.x * Colour.r * ColourScale.x, Result.y * Colour.g * ColourScale.y, Result.z * Colour.b * ColourScale.z, 1);

    return Result;
}

technique Technique1
{
    pass
    {
        VertexShader = compile vs_3_0 SpriteVertexShader();
        PixelShader = compile ps_3_0 FractalPixelShader(128);
    }
}
#包括“FractalBase.fxh”
浮动功率;
3种颜色;
3色标;
浮动ComAbs(浮动2 Arg)
{
返回sqrt(Arg.x*Arg.x+Arg.y*Arg.y);
}
浮动2组件(浮动2参数,浮动功率)
{
浮动模式=功率(参数x*参数x+参数y*参数y,功率/2);
浮点数Ang=atan2(参数y、参数x)*功率;
返回浮动2(Mod*cos(Ang),Mod*sin(Ang));
}
浮点大于(浮点x,浮点y)
{
回报率((x-y)/(2*abs(x-y))+0.5)*1.001;
}
float4 FractalPixelShader(float2 texCoord:TEXCOORD0,均匀浮点迭代):COLOR0
{
float2 c=texCoord.xy;
2 z=0;
int i;
浮点数试验=0;
浮球试验=0;
int KeepGoing=1;
int DoneIterations=迭代次数;
国际援助=0;
对于(i=0;i=迭代次数-1)?float4(0.0,0.0,0.0,1.0):float4(Result.x*color.r*colorscale.x,Result.y*color.g*colorscale.y,Result.z*color.b*colorscale.z,1);
返回结果;
}
技术1
{
通过
{
VertexShader=编译vs_3_0 SpriteVertexShader();
PixelShader=编译ps_3_0 FractalPixelShader(128);
}
}

xbox的块大小相当大,因此在xbox上进行分支并不总是那么好。此外,编译器在发出代码似乎使用的动态分支方面并不总是最有效的

查看分支属性:

此外,如果你提前出手救助,PC是否会变得更像Xbox


请记住,到目前为止,现代图形卡实际上比氙气设备快了很多。

xbox的块大小相当大,因此在xbox上进行分支并不总是那么好。此外,编译器在发出代码似乎使用的动态分支方面并不总是最有效的

查看分支属性:

此外,如果你提前出手救助,PC是否会变得更像Xbox


请记住,到目前为止,现代图形卡实际上比氙气装置快了很多。

感谢您的快速回复。添加[branch]属性似乎没有任何作用。有趣的是,删除if和break可以让xbox完美运行。看来我要做一些有趣的事情了,用lerp?代码更新为使用steplerp,同样的抖动,删除step会加快速度,所以现在我需要一个替换函数!Step有很多相关指令。更可能的情况是,删除步骤使编译器能够运行一整套优化,否则就无法运行。目前尚不清楚如何改进这一点。。。我会考虑一下。如果你,或者其他人能想出一些东西,那就太好了,它现在不能用了。是否有解释相关说明等的链接?请参阅我的编辑,如果有,我将进入底部,回家后只需交叉手指并在xbox上试用。感谢您的快速回复。添加[branch]属性似乎没有任何作用。有趣的是,删除if和break可以让xbox完美运行。看来我要做一些有趣的事情了,用lerp?代码更新为使用steplerp,同样的抖动,删除step会加快速度,所以现在我需要一个替换函数!Step有很多相关指令。更可能的情况是,删除步骤使编译器能够运行一整套优化,否则就无法运行。目前尚不清楚如何改进这一点。。。我会考虑一下。如果你,或者其他人能想出一些东西,那就太好了,它现在不能用了。是否有解释相关说明等的链接?请参阅我的编辑,如果有,我会找到底部,只需交叉手指,回家后在xbox上试用即可。
#include "FractalBase.fxh"

float ZPower;

float3 Colour;
float3 ColourScale;

float ComAbs(float2 Arg)
{
    return sqrt(Arg.x * Arg.x + Arg.y * Arg.y);
}

float2 ComPow(float2 Arg, float Power)
{
    float Mod = pow(Arg.x * Arg.x + Arg.y * Arg.y, Power / 2);
    float Ang = atan2(Arg.y, Arg.x) * Power;

    return float2(Mod * cos(Ang), Mod * sin(Ang));
}

float GreaterThan(float x, float y)
{
    return ((x - y) / (2 * abs(x - y)) + 0.5) * 1.001;
}

float4 FractalPixelShader(float2 texCoord : TEXCOORD0, uniform float Iterations) : COLOR0
{
    float2 c = texCoord.xy;
    float2 z = 0;

    int i;

    float oldBailoutTest = 0;
    float bailoutTest = 0;

    int KeepGoing = 1;

    int DoneIterations = Iterations;

    int Bailout = 0;

    for(i = 0; i < Iterations; i++)
    {
        z = lerp(z, ComPow(z, ZPower) + c, KeepGoing);

        bailoutTest = lerp(bailoutTest, z.x * z.x + z.y * z.y, KeepGoing);

        Bailout = lerp(Bailout, GreaterThan(bailoutTest, ZPower * ZPower), -abs(Bailout) + 1);

        KeepGoing = lerp(KeepGoing, 0.0, Bailout);
        DoneIterations = lerp(DoneIterations, min(i, DoneIterations), Bailout);

        oldBailoutTest = lerp(oldBailoutTest, bailoutTest, KeepGoing);
    }

    float normalisedIterations = DoneIterations / Iterations;
    float factor = (bailoutTest - oldBailoutTest) / (ZPower * ZPower - oldBailoutTest);

    float4 Result = normalisedIterations + (1 / factor / Iterations);

    Result = (DoneIterations >= Iterations - 1) ? float4(0.0, 0.0, 0.0, 1.0) : float4(Result.x * Colour.r * ColourScale.x, Result.y * Colour.g * ColourScale.y, Result.z * Colour.b * ColourScale.z, 1);

    return Result;
}

technique Technique1
{
    pass
    {
        VertexShader = compile vs_3_0 SpriteVertexShader();
        PixelShader = compile ps_3_0 FractalPixelShader(128);
    }
}