柏林噪声与XNA

本文关键字:XNA 噪声 柏林 | 更新日期: 2023-09-27 17:52:35

我需要一个实时的柏林噪声生成我正在执行的2d游戏。CPU噪声运行良好,但需要1秒左右的屏幕尺寸(1920 x 1080)。我可以在没有太多干扰的情况下将其放大4倍,但假设我的cpu相当快,这仍然有点慢。所以我想在GPU上实现它。问题是我没有使用HLSL的经验,也没有太多的教程。我试着实现这个(我几乎复制了它的全部),并添加了这个:

void SpriteVertexShader(inout float4 color    : COLOR0,
                        inout float2 texCoord : TEXCOORD0,
                        inout float4 position : SV_Position)
{
    position = mul(position, MatrixTransform);
}
technique Technique1
{
    pass Pass1
    {
        // TODO: set renderstates here.
        VertexShader = compile vs_3_0 SpriteVertexShader();
        PixelShader = compile ps_3_0 PixelShaderFunction();
    }
}

在末尾。我这样称呼它:

Matrix projection = Matrix.CreateOrthographicOffCenter(0,
  GraphicsDevice.Viewport.Width,
  GraphicsDevice.Viewport.Height, 0, 0, 1);
Matrix halfPixelOffset = Matrix.CreateTranslation(-0.5f, -0.5f, 0);
perlin.Parameters["MatrixTransform"].SetValue(halfPixelOffset * projection);
perlin.CurrentTechnique = perlin.Techniques["Technique1"];
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);
perlin.CurrentTechnique.Passes[0].Apply();
spriteBatch.Draw(new Texture2D(GraphicsDevice,1000,1000),
                               new Rectangle(0, 0, 500, 500), Color.White);
spriteBatch.End();

,我终于得到了一个黑色的纹理。我做错了什么?我不明白顶点着色器的部分…但这里他们说我必须改变它,这样我就不会得到错误:"这是太复杂的目标着色器模型"…

柏林噪声与XNA

似乎XNA不支持这样创建的纹理:

texture permTexture
<
  string texturetype = "2D";
  string format = "l8";
  string function = "GeneratePermTexture";
  int width = 256, height = 1;
>;
float4 GeneratePermTexture(float p : POSITION) : COLOR
{
  return permutation[p * 256] / 255.0;
}
sampler permSampler = sampler_state
{
  texture = <permTexture>;
  AddressU  = Wrap;
  AddressV  = Clamp;
  MAGFILTER = POINT;
  MINFILTER = POINT;
  MIPFILTER = NONE;
};

你需要在shader之外创建烫发纹理和烫发渐变,然后将它们作为参数传递给shader。

我开始写代码,但已经在这里找到了一个例子:XNA 4.0柏林噪声使用gpu