使用 SharpDX 绘制二维矩形
Drawing a 2D rectangle with SharpDX
如何用SharpDX绘制一个普通的红色二维矩形?
- 我有一个 SharpDX.Direct3D9.Device available from a library 可以为我设置 Direct3D v9 设备,所以我希望能够使用它?
Found a tutorial on how to use Direct2D1 to draw a basic rectangle,但代码似乎依赖于 Direct3D11 设备,而我没有 - 我需要能够在没有 Direct3D11 和 Direct3D10 的情况下完成工作
unsafe int PresentHook(IntPtr devicePtr, SharpDX.Rectangle* pSourceRect, SharpDX.Rectangle* pDestRect, IntPtr hDestWindowOverride, IntPtr pDirtyRegion)
{
_isUsingPresent = true;
SharpDX.Direct3D9.Device device = (SharpDX.Direct3D9.Device)devicePtr;
// How to draw rectangle here?
if (pSourceRect == null || *pSourceRect == SharpDX.Rectangle.Empty)
device.Present();
else
{
if (hDestWindowOverride != IntPtr.Zero)
device.Present(*pSourceRect, *pDestRect, hDestWindowOverride);
else
device.Present(*pSourceRect, *pDestRect);
}
return SharpDX.Result.Ok.Code;
}
可以使用如下方式绘制精灵:
// Be sure to only initialise these only once (or as needed)
// not every frame.
//use relative path
string dir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string filename = dir + @"\image.bmp";
var _mytext = SharpDX.Direct3D9.Texture.FromFile(device, filename);
var _sprite = new SharpDX.Direct3D9.Sprite(device);
float posLeft = 10f;
float posTop = 10f;
var pos = new SharpDX.Vector3(posLeft, posTop, 0);
var color = new SharpDX.ColorBGRA(0xffffffff);
_sprite.Begin(SharpDX.Direct3D9.SpriteFlags.AlphaBlend);
_sprite.Draw(_myText, color, null, null, pos);
_sprite.End();
以这种方式加载纹理将创建一个方形纹理,如果设备功能支持它,那么您可以在加载纹理时指定尺寸,例如
var _myText = SharpDX.Direct3D9.Texture.FromFile(device, filename, imageSize.Width, imageSize.Height, 0, Usage.None, Format.A8B8G8R8, Pool.Default, Filter.Default, Filter.Default, 0);
否则您可以在变换中适当缩放 X 和 Y:
// Get image dimensions
Size imageSize;
using (var img = Image.FromFile(filename))
{
imageSize = img.Size;
}
// Calculate scale to get correct image size
var transform = SharpDX.Matrix.AffineTransformation2D(1f, 0f, Vector2.Zero);
// Calculate width scale
if (imageSize.Width <= 128)
{
transform.M11 = (float)imageSize.Width / 128f; // scale x
}
else if (imageSize.Width <= 256)
{
transform.M11 = (float)imageSize.Width / 256f; // scale x
}
else if (imageSize.Width <= 512)
{
transform.M11 = (float)imageSize.Width / 512f; // scale x
}
else if (imageSize.Width <= 1024)
{
transform.M11 = (float)imageSize.Width / 1024f; // scale x
}
// Calculate height scale
if (imageSize.Height <= 128)
{
transform.M22 = (float)imageSize.Height / 128f; // scale y
}
else if (imageSize.Height <= 256)
{
transform.M22 = (float)imageSize.Height / 256f; // scale y
}
else if (imageSize.Height <= 512)
{
transform.M22 = (float)imageSize.Height / 512f; // scale y
}
else if (imageSize.Height <= 1024)
{
transform.M22 = (float)imageSize.Height / 1024f; // scale y
}
_sprite.Transform = transform;
如何用SharpDX绘制一个普通的红色二维矩形?
- 我有一个 SharpDX.Direct3D9.Device available from a library 可以为我设置 Direct3D v9 设备,所以我希望能够使用它?
Found a tutorial on how to use Direct2D1 to draw a basic rectangle,但代码似乎依赖于 Direct3D11 设备,而我没有 - 我需要能够在没有 Direct3D11 和 Direct3D10 的情况下完成工作
unsafe int PresentHook(IntPtr devicePtr, SharpDX.Rectangle* pSourceRect, SharpDX.Rectangle* pDestRect, IntPtr hDestWindowOverride, IntPtr pDirtyRegion) { _isUsingPresent = true; SharpDX.Direct3D9.Device device = (SharpDX.Direct3D9.Device)devicePtr; // How to draw rectangle here? if (pSourceRect == null || *pSourceRect == SharpDX.Rectangle.Empty) device.Present(); else { if (hDestWindowOverride != IntPtr.Zero) device.Present(*pSourceRect, *pDestRect, hDestWindowOverride); else device.Present(*pSourceRect, *pDestRect); } return SharpDX.Result.Ok.Code; }
可以使用如下方式绘制精灵:
// Be sure to only initialise these only once (or as needed)
// not every frame.
//use relative path
string dir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string filename = dir + @"\image.bmp";
var _mytext = SharpDX.Direct3D9.Texture.FromFile(device, filename);
var _sprite = new SharpDX.Direct3D9.Sprite(device);
float posLeft = 10f;
float posTop = 10f;
var pos = new SharpDX.Vector3(posLeft, posTop, 0);
var color = new SharpDX.ColorBGRA(0xffffffff);
_sprite.Begin(SharpDX.Direct3D9.SpriteFlags.AlphaBlend);
_sprite.Draw(_myText, color, null, null, pos);
_sprite.End();
以这种方式加载纹理将创建一个方形纹理,如果设备功能支持它,那么您可以在加载纹理时指定尺寸,例如
var _myText = SharpDX.Direct3D9.Texture.FromFile(device, filename, imageSize.Width, imageSize.Height, 0, Usage.None, Format.A8B8G8R8, Pool.Default, Filter.Default, Filter.Default, 0);
否则您可以在变换中适当缩放 X 和 Y:
// Get image dimensions
Size imageSize;
using (var img = Image.FromFile(filename))
{
imageSize = img.Size;
}
// Calculate scale to get correct image size
var transform = SharpDX.Matrix.AffineTransformation2D(1f, 0f, Vector2.Zero);
// Calculate width scale
if (imageSize.Width <= 128)
{
transform.M11 = (float)imageSize.Width / 128f; // scale x
}
else if (imageSize.Width <= 256)
{
transform.M11 = (float)imageSize.Width / 256f; // scale x
}
else if (imageSize.Width <= 512)
{
transform.M11 = (float)imageSize.Width / 512f; // scale x
}
else if (imageSize.Width <= 1024)
{
transform.M11 = (float)imageSize.Width / 1024f; // scale x
}
// Calculate height scale
if (imageSize.Height <= 128)
{
transform.M22 = (float)imageSize.Height / 128f; // scale y
}
else if (imageSize.Height <= 256)
{
transform.M22 = (float)imageSize.Height / 256f; // scale y
}
else if (imageSize.Height <= 512)
{
transform.M22 = (float)imageSize.Height / 512f; // scale y
}
else if (imageSize.Height <= 1024)
{
transform.M22 = (float)imageSize.Height / 1024f; // scale y
}
_sprite.Transform = transform;