使用Direct3D.Texture“环绕”效果

时间:2009-09-29 23:01:09

标签: c# directx

给定目标矩形和x / y偏移值,我需要在该目标矩形的范围内绘制图像。如果偏移将图像推离矩形的边缘,则“推出”的部分应出现在目标矩形的相对侧。简单来说,我需要滚动背景。

在GDI中,我可以使用一个使用tile处理模式的“ImageAttributes”对象来实现这个目的:

ImageAttributes attributes = new ImageAttributes();
attributes.SetWrapMode(System.Drawing.Drawing2D.WrapMode.Tile);

Rectangle rectangle = new Rectangle(0, 0, (int)width, (int)height);
g.DrawImage(bmp, rectangle, -x, -y, width, height, GraphicsUnit.Pixel, attributes);

现在,我需要一种在DirectX中执行此操作的方法。假设这是我现在的方法:

public void RenderTexture(PrismDXObject obj, D3D.Texture texture, int xOffset, int yOffset)
{
    if (obj != null && texture != null)
    {
        _renderSprite.Begin(D3D.SpriteFlags.AlphaBlend);
        _renderSprite.Draw(texture,
            new Rectangle(0, 0, (int)obj.Width, (int)obj.Height),
            new Vector3(0.0f, 0.0f, 0.0f),
            new Vector3((int)obj.Left, (int)obj.Top, 0.0f),
            obj.RenderColor);
            _renderSprite.End();
        }
    }
}

...其中“_renderSprite”是D3D.Sprite,而PrismDXObject是一个存储x / y / width / height / color的简单类。如何更新此方法以便可以使用xOffset和yOffset进行纹理包装?请记住,我的最终目标是滚动背景,随着玩家前进而循环。

顺便说一句,RenderTexture()方法是一个“库方法”,可以从我的程序中的任何地方调用...所以如果我做的事情效率很低或者不明智,我会欢迎友好警告!我主要担心的是让包装背景起作用。

1 个答案:

答案 0 :(得分:0)

我不确定精灵机制是否允许我要解释的内容,但是2个三角形当然可以。如果这不适用于精灵,请直接使用三角形:

纹理子系统直接支持您所要求的内容,它称为纹理包装。

  • 如果指定四边形将使用的纹理坐标,而不是使用0,0-1,1范围,则可以使用0+xoffset/tex_x_size, 0+yoffset/tex_y_size, 1+xoffset/tex_x_size, 1+yoffset/tex_y_size作为纹理坐标。
  • 然后,剩下要做的就是指定用于映射背景的纹理采样器进行纹理包装。为此,您需要将D3DTADDRESS_WRAPD3DSAMP_ADDRESSU采样器状态设置为D3DSAMP_ADDRESSV。请注意,这是采样器状态的默认

就是这样。现在,具体回到D3D.Sprite,Draw方法采用一个矩形来指示要使用的纹理部分。你试过画xoffset, yoffset, xOffset+obj,Width, yoffset+obj.height吗?这只有在精灵子系统使用包装的采样器时才有效,而且我不知道精灵是如何在内部实现的。