Jump to content
  • Advertisement
Sign in to follow this  
Telanor

Directwrite not rendering correctly

This topic is 2177 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I'm trying to get directwrite to work with directx 11 in slimdx and all its doing is rendering half of a fullscreen quad (so just one triangle) in yellow and the other half is transparent (so the rest of the game is viewable under it). For whatever reason PIX absolutely hates directwrite and just immediately crashes when I try to debug it. Can anyone see what I'm doing wrong?

Here's my directwrite related code:


public static void Initialize()
{
//Factory1 factory1 = new Factory1();
//Factory1 factory1 = (Factory1) Engine.Device.Factory;
//Adapter1 adapter1 = factory1.GetAdapter1(0);
Adapter1 adapter1 = Engine.Adapter;
SlimDX.Direct3D10_1.Device1 device10_1 = new SlimDX.Direct3D10_1.Device1(adapter1, SlimDX.Direct3D10.DriverType.Hardware, SlimDX.Direct3D10.DeviceCreationFlags.BgraSupport, SlimDX.Direct3D10_1.FeatureLevel.Level_10_0);

d3d11Texture = new Texture2D(Engine.Device, new Texture2DDescription
{
Width = (int)Engine.Viewport.Width,
Height = (int)Engine.Viewport.Height,
MipLevels = 1,
ArraySize = 1,
Format = Format.B8G8R8A8_UNorm,
SampleDescription = new SampleDescription(1, 0),
Usage = ResourceUsage.Default,
BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource,
CpuAccessFlags = CpuAccessFlags.None,
OptionFlags = ResourceOptionFlags.KeyedMutex
});

SlimDX.Direct3D10.Texture2D d3d10Texture;

sharedResource = new Resource(d3d11Texture);
d3d10Texture = device10_1.OpenSharedResource<SlimDX.Direct3D10.Texture2D>(sharedResource.SharedHandle);

d3d10Mutex = new KeyedMutex(d3d10Texture);
d3d11Mutex = new KeyedMutex(d3d11Texture);

SlimDX.Direct2D.Factory d2Factory = new SlimDX.Direct2D.Factory(SlimDX.Direct2D.FactoryType.SingleThreaded, DebugLevel.Information);
DirectWriteFactory = new SlimDX.DirectWrite.Factory(SlimDX.DirectWrite.FactoryType.Shared);

Surface surface = d3d10Texture.AsSurface();
RenderTargetProperties rtp = new RenderTargetProperties
{
MinimumFeatureLevel = SlimDX.Direct2D.FeatureLevel.Direct3D10,
Type = RenderTargetType.Hardware,
Usage = RenderTargetUsage.None,
PixelFormat = new PixelFormat(Format.Unknown, AlphaMode.Premultiplied)
};

dwRenderTarget = RenderTarget.FromDXGI(d2Factory, surface, rtp);

DefaultFont = DirectWriteFactory.CreateTextFormat("Arial", FontWeight.Regular, FontStyle.Normal, FontStretch.Normal, 24, "en-us");
DefaultFont.TextAlignment = SlimDX.DirectWrite.TextAlignment.Center;
DefaultFont.ParagraphAlignment = ParagraphAlignment.Center;
//DefaultFont = new TextFormat(DirectWriteFactory, "Arial", FontWeight.Normal, FontStyle.Normal, FontStretch.Normal, 24, "en-US")
//{
// TextAlignment = SlimDX.DirectWrite.TextAlignment.Center,
// ParagraphAlignment = ParagraphAlignment.Center
//};

WhiteBrush = new SolidColorBrush(dwRenderTarget, Color.White);

BlendStateDescription bsd = new BlendStateDescription();
bsd.RenderTargets[0].BlendEnable = true;
bsd.RenderTargets[0].BlendEnable = true;
bsd.RenderTargets[0].SourceBlend = BlendOption.SourceAlpha;
bsd.RenderTargets[0].DestinationBlend = BlendOption.InverseSourceAlpha;
bsd.RenderTargets[0].BlendOperation = BlendOperation.Add;
bsd.RenderTargets[0].SourceBlendAlpha = BlendOption.One;
bsd.RenderTargets[0].DestinationBlendAlpha = BlendOption.Zero;
bsd.RenderTargets[0].BlendOperationAlpha = BlendOperation.Add;
bsd.RenderTargets[0].RenderTargetWriteMask = ColorWriteMaskFlags.All;

blendStateTransparent = BlendState.FromDescription(Engine.Device, bsd);

var vertices = new DataStream(VertexPositionTexture.SizeInBytes * 4, true, true);
vertices.Write(new VertexPositionTexture(new Vector3(-1, 1, 0), new Vector2(0, 0)));
vertices.Write(new VertexPositionTexture(new Vector3(1, 1, 0), new Vector2(1, 0)));
vertices.Write(new VertexPositionTexture(new Vector3(-1, -1, 0), new Vector2(0, 1)));
vertices.Write(new VertexPositionTexture(new Vector3(1, -1, 0), new Vector2(1, 1)));
vertices.Position = 0;

effect = ContentLoader.LoadEffect(@"Content\Effects\FontShader.fx");
layout = new InputLayout(Engine.Device, effect.GetTechniqueByIndex(0).GetPassByIndex(0).Description.Signature, VertexPositionTexture.VertexDeclaration);
vertexBuffer = new Buffer(Engine.Device, vertices, (int)vertices.Length, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
vertices.Close();

//factory1.Dispose();
//adapter1.Dispose();
device10_1.Dispose();
d2Factory.Dispose();
surface.Dispose();
d3d10Texture.Dispose();
//sharedResource.Dispose();
}

public static void DrawString(TextFormat format, string text, Rectangle rect, SlimDX.Direct2D.Brush brush, float rotation, PointF origin, SizeF scale)
{
//return;
dwRenderTarget.Transform = Matrix3x2.Scale(scale, origin) * Matrix3x2.Rotation(rotation, origin);

d3d10Mutex.Acquire(0, 100);
{
dwRenderTarget.BeginDraw();
dwRenderTarget.Clear(new Color4(0, 0, 0, 0));
dwRenderTarget.DrawText(text, format, rect, brush);
dwRenderTarget.EndDraw();
}
d3d10Mutex.Release(0);

d3d11Mutex.Acquire(0, 100);
{
using(var srv = new ShaderResourceView(Engine.Device, d3d11Texture))
{
Engine.Context.InputAssembler.InputLayout = layout;
Engine.Context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
Engine.Context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertexBuffer, VertexPositionTexture.SizeInBytes, 0));
Engine.Context.OutputMerger.BlendState = blendStateTransparent;

effect.GetVariableByName("TextOverlay").AsResource().SetResource(srv);
effect.GetTechniqueByIndex(0).GetPassByIndex(0).Apply(Engine.Context);
Engine.Context.Draw(4, 0);
}
}
d3d11Mutex.Release(0);
}



And a screenshot of what it's doing:
[attachment=9293:RuinValor 2012-06-06 03-07-31-73.png] Edited by Telanor

Share this post


Link to post
Share on other sites
Advertisement
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!