Как рисовать текст с помощью SharpDX?

Я просматривал Интернет, пытаясь найти код, который позволяет мне рисовать текст из обычного шрифта (не спрайтового шрифта), и нашел только фрагменты, которые мне совсем не помогли.

Есть ли у кого-нибудь полный исходный файл, который позволяет мне легко рисовать текст с помощью SharpDX и D3D11/DirectWrite? Я хочу сделать прозрачное оверлейное окно, отображающее некоторую информацию (например, Fraps). Я нашел учебник, который делает это, но в нем используется спрайтовый шрифт, и я хочу, чтобы его можно было настраивать с точки зрения размера и шрифта.

Это то, что у меня есть до сих пор:

using System;
using SharpDX;
using SharpDX.Direct3D11;
using SharpDX.Windows;
using SharpDX.Direct2D1;
using SharpDX.DirectWrite;
using SharpDX.DXGI;

namespace SharpDXRenderer
{
    static class Program
    {

        [STAThread]
        static void Main()
        {
            SharpDX.DirectWrite.TextFormat directWriteTextFormat;
            SharpDX.DirectWrite.Factory directWriteFactory;
            SharpDX.Direct2D1.SolidColorBrush directWriteFontColor;
            SharpDX.Direct2D1.RenderTarget direct2DRenderTarget;
            Surface d2dSurface;

            RenderForm form = new RenderForm("Example");

            var desc = new SwapChainDescription()
            {
                BufferCount = 1,//buffer count
                ModeDescription = new ModeDescription(form.ClientSize.Width,     form.ClientSize.Height, new Rational(60, 1), Format.R8G8B8A8_UNorm),//sview
                IsWindowed = true,
                OutputHandle = form.Handle,
                SampleDescription = new SampleDescription(1, 0),
                SwapEffect = SwapEffect.Discard,
                Usage = Usage.RenderTargetOutput
            };



            var d2dFactory = new SharpDX.Direct2D1.Factory();
            d2dSurface = backBuffer.QueryInterface<Surface>();

            direct2DRenderTarget = new SharpDX.Direct2D1.RenderTarget(d2dFactory, d2dSurface, new     SharpDX.Direct2D1.RenderTargetProperties(new     SharpDX.Direct2D1.PixelFormat(Format.Unknown,     SharpDX.Direct2D1.AlphaMode.Premultiplied)));

            directWriteFactory = new SharpDX.DirectWrite.Factory();

            directWriteTextFormat = new SharpDX.DirectWrite.TextFormat(directWriteFactory, "Calibri", 12) {     TextAlignment = SharpDX.DirectWrite.TextAlignment.Leading, ParagraphAlignment =     SharpDX.DirectWrite.ParagraphAlignment.Near };

            directWriteFontColor = new SharpDX.Direct2D1.SolidColorBrush(direct2DRenderTarget, Color.White);
        }
    }
}

Я знаю, что мне не хватает SwapChain, устройства и, я думаю, текстуры, но я не уверен, что мне нужно что-то еще. Мне не хватает этого backBuffer, но я не знаю, какого он типа.

d2dSurface = backBuffer.QueryInterface<Surface>();

Любая помощь в отношении текста и рисования базовой формы приветствуется.

Заранее спасибо.


person SPACoD    schedule 27.10.2015    source источник
comment
Добро пожаловать в Stack Overflow. В нынешнем виде ваш вопрос может быть удален, потому что вы запрашиваете внешний ресурс. Вместо этого вам нужно разобрать свой код и понять, что с ним не так. Тогда люди смогут вам помочь.   -  person Rohit Gupta    schedule 27.10.2015
comment
Спасибо. Однако есть вопрос. Куда вставить код? У меня уже есть часть, но мне чего-то не хватает, чтобы заставить ее работать. Я опубликую это как ответ на этот вопрос или что-то еще? Спасибо еще раз.   -  person SPACoD    schedule 28.10.2015
comment
Просто отредактируйте свой пост и добавьте его в конец. Добавьте префикс каждой строки кода с 4 пробелами, и он отформатирует ее.   -  person Rohit Gupta    schedule 28.10.2015
comment
Спасибо за помощь, отредактировал.   -  person SPACoD    schedule 28.10.2015
comment
Теперь, когда вопрос выглядит лучше, я проголосовал за него.   -  person Rohit Gupta    schedule 29.10.2015


Ответы (1)


Я новичок в SharpDx, поэтому отнеситесь к моему предложению с долей скептицизма, но я использую SharpDX.Direct2D1.DeviceContext для рендеринга текста в своем приложении. Насколько я понимаю, именно Direct2D позволяет относительно легко отображать текст. (по крайней мере, в 2D) Много примеров/подробностей на https://github.com/spazzarama/Direct3D-Rendering-Cookbook (которая связана с одноименной книгой SharpDx)

context2D.DrawText("myTextHere", _textFormat, new RectangleF(0, 0, 100, 100), _gradeLines[ii].ForegroundBrush);
person millejos    schedule 22.01.2016
comment
Как вы вызываете DrawText в Direct2D1.DeviceContext? Вроде нет такого метода. Однако он находится на RenderTarget: sharpdx.org/wiki/class-library-api/direct2d1. .html - person Asik; 23.01.2016
comment
SharpDX.Direct2D1.DeviceContext расширяет родительский класс RenderTarget, и вы правы, он находится в классе RenderTarget. - person millejos; 23.01.2016
comment
Хм, надо было это проверить. Спасибо! - person Asik; 23.01.2016