Worked on issue #531. Primitives sample is now much more complete. The instanced primitives are looking much better in PIX now, but still not rendering.

This commit is contained in:
Glatzemann 2012-09-22 11:17:36 +00:00 committed by Konstantin Koch
parent 825ed2b10c
commit 0c98c29886
9 changed files with 196 additions and 51 deletions

View File

@ -142,7 +142,7 @@ namespace ANX.Framework.Graphics
int startIndex, int primitiveCount, int instanceCount) int startIndex, int primitiveCount, int instanceCount)
{ {
NativeDevice.DrawInstancedPrimitives(primitiveType, baseVertex, minVertexIndex, numVertices, startIndex, NativeDevice.DrawInstancedPrimitives(primitiveType, baseVertex, minVertexIndex, numVertices, startIndex,
primitiveCount, instanceCount); primitiveCount, instanceCount, this.indexBuffer);
} }
#endregion #endregion

View File

@ -17,7 +17,7 @@ namespace ANX.Framework.NonXNA
void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, IndexBuffer indexBuffer); void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, IndexBuffer indexBuffer);
void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices,
int startIndex, int primitiveCount, int instanceCount); int startIndex, int primitiveCount, int instanceCount, IndexBuffer indexBuffer);
void DrawUserIndexedPrimitives<T>(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int numVertices, void DrawUserIndexedPrimitives<T>(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int numVertices,
Array indexData, int indexOffset, int primitiveCount, VertexDeclaration vertexDeclaration, Array indexData, int indexOffset, int primitiveCount, VertexDeclaration vertexDeclaration,

View File

@ -259,7 +259,7 @@ namespace ANX.RenderSystem.GL3
#region DrawInstancedPrimitives (TODO) #region DrawInstancedPrimitives (TODO)
public void DrawInstancedPrimitives(PrimitiveType primitiveType, public void DrawInstancedPrimitives(PrimitiveType primitiveType,
int baseVertex, int minVertexIndex, int numVertices, int startIndex, int baseVertex, int minVertexIndex, int numVertices, int startIndex,
int primitiveCount, int instanceCount) int primitiveCount, int instanceCount, IndexBuffer indexBuffer)
{ {
//GL.DrawArraysInstanced( //GL.DrawArraysInstanced(
// DatatypesMapping.PrimitiveTypeToBeginMode(primitiveType), // DatatypesMapping.PrimitiveTypeToBeginMode(primitiveType),

View File

@ -49,6 +49,39 @@ namespace ANX.RenderSystem.Windows.DX11
} }
#endregion #endregion
public static int FormatSize(VertexElementFormat format)
{
switch (format)
{
case VertexElementFormat.Byte4:
return 4;
case VertexElementFormat.Color:
return 4;
case VertexElementFormat.HalfVector2:
return 4;
case VertexElementFormat.HalfVector4:
return 8;
case VertexElementFormat.NormalizedShort2:
return 4;
case VertexElementFormat.NormalizedShort4:
return 8;
case VertexElementFormat.Short2:
return 4;
case VertexElementFormat.Short4:
return 8;
case VertexElementFormat.Single:
return 4;
case VertexElementFormat.Vector2:
return 8;
case VertexElementFormat.Vector3:
return 12;
case VertexElementFormat.Vector4:
return 16;
}
throw new ArgumentException("Invalid format '" + format + "'.");
}
#region Translate (SurfaceFormat) #region Translate (SurfaceFormat)
public static SharpDX.DXGI.Format Translate(SurfaceFormat surfaceFormat) public static SharpDX.DXGI.Format Translate(SurfaceFormat surfaceFormat)
{ {

View File

@ -36,7 +36,8 @@ namespace ANX.RenderSystem.Windows.DX11
protected uint lastClearColor; protected uint lastClearColor;
protected SharpDX.Color4 clearColor; protected SharpDX.Color4 clearColor;
protected SharpDX.DXGI.SwapChain swapChain; protected SharpDX.DXGI.SwapChain swapChain;
protected VertexBuffer currentVertexBuffer; protected VertexBufferBinding[] currentVertexBuffer;
protected int currentVertexBufferCount;
protected IndexBuffer currentIndexBuffer; protected IndexBuffer currentIndexBuffer;
#endregion #endregion

View File

@ -111,14 +111,14 @@ namespace ANX.RenderSystem.PsVita
#region INativeGraphicsDevice Member #region INativeGraphicsDevice Member
public void DrawIndexedPrimitives(PrimitiveType primitiveType, public void DrawIndexedPrimitives(PrimitiveType primitiveType,
int baseVertex, int minVertexIndex, int numVertices, int startIndex, int baseVertex, int minVertexIndex, int numVertices, int startIndex,
int primitiveCount) int primitiveCount, IndexBuffer indexBuffer)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
public void DrawInstancedPrimitives(PrimitiveType primitiveType, public void DrawInstancedPrimitives(PrimitiveType primitiveType,
int baseVertex, int minVertexIndex, int numVertices, int startIndex, int baseVertex, int minVertexIndex, int numVertices, int startIndex,
int primitiveCount, int instanceCount) int primitiveCount, int instanceCount, IndexBuffer indexBuffer)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }

View File

@ -59,8 +59,13 @@ namespace ANX.RenderSystem.Windows.DX10
#region SetValue (Matrix, transpose) (TODO) #region SetValue (Matrix, transpose) (TODO)
public void SetValue(Matrix value, bool transpose) public void SetValue(Matrix value, bool transpose)
{ {
// TODO: handle transpose! Matrix val = value;
NativeParameter.AsMatrix().SetMatrix(value); if (transpose)
{
Matrix.Transpose(ref val, out val);
}
NativeParameter.AsMatrix().SetMatrix(val);
} }
#endregion #endregion

View File

@ -1,10 +1,12 @@
#region Using Statements #region Using Statements
using System; using System;
using System.Collections.Generic;
using ANX.Framework; using ANX.Framework;
using ANX.Framework.Graphics; using ANX.Framework.Graphics;
using ANX.Framework.NonXNA; using ANX.Framework.NonXNA;
using SharpDX.D3DCompiler; using SharpDX.D3DCompiler;
using SharpDX.DXGI; using SharpDX.DXGI;
using SharpDX.Direct3D10;
#endregion #endregion
@ -243,9 +245,28 @@ namespace ANX.RenderSystem.Windows.DX10
#region DrawInstancedPrimitives #region DrawInstancedPrimitives
public void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, public void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices,
int startIndex, int primitiveCount, int instanceCount) int startIndex, int primitiveCount, int instanceCount, IndexBuffer indexBuffer)
{ {
nativeDevice.DrawIndexedInstanced(numVertices, instanceCount, startIndex, baseVertex, 0); Dx10.EffectTechnique technique = SetupEffectForDraw();
int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount);
nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType);
nativeDevice.Rasterizer.SetViewports(currentViewport);
nativeDevice.OutputMerger.SetTargets(this.depthStencilView, this.renderView);
if (indexBuffer != null)
{
SetIndexBuffer(indexBuffer);
}
for (int i = 0; i < technique.Description.PassCount; ++i)
{
technique.GetPassByIndex(i).Apply();
nativeDevice.DrawIndexedInstanced(vertexCount, instanceCount, startIndex, baseVertex, 0);
}
nativeDevice.InputAssembler.InputLayout.Dispose();
nativeDevice.InputAssembler.InputLayout = null;
} }
#endregion #endregion
@ -333,15 +354,13 @@ namespace ANX.RenderSystem.Windows.DX10
#endregion #endregion
#region SetupInputLayout #region SetupInputLayout
private void SetupInputLayout(ShaderBytecode passSignature) private InputLayout SetupInputLayout(ShaderBytecode passSignature)
{ {
if (currentVertexBuffer == null) // get the VertexDeclaration from current VertexBuffer to create input layout for the input assembler
throw new ArgumentNullException("passSignature"); var layout = CreateInputLayout(nativeDevice, passSignature, currentVertexBuffer);
VertexDeclaration vertexDeclaration = currentVertexBuffer.VertexDeclaration; nativeDevice.InputAssembler.InputLayout = layout;
var layout = CreateInputLayout(nativeDevice, passSignature, vertexDeclaration); return layout;
nativeDevice.InputAssembler.InputLayout = layout;
} }
#endregion #endregion
@ -367,15 +386,24 @@ namespace ANX.RenderSystem.Windows.DX10
#endregion #endregion
#region SetVertexBuffers #region SetVertexBuffers
public void SetVertexBuffers(VertexBufferBinding[] vertexBuffers) public void SetVertexBuffers(ANX.Framework.Graphics.VertexBufferBinding[] vertexBuffers)
{ {
if (vertexBuffers == null) if (vertexBuffers == null)
throw new ArgumentNullException("vertexBuffers"); throw new ArgumentNullException("vertexBuffers");
this.currentVertexBuffer = vertexBuffers[0].VertexBuffer; //TODO: hmmmmm, not nice :-) this.currentVertexBufferCount = vertexBuffers.Length;
Dx10.VertexBufferBinding[] nativeVertexBufferBindings = if (this.currentVertexBuffer == null || this.currentVertexBuffer.Length < currentVertexBufferCount)
new Dx10.VertexBufferBinding[vertexBuffers.Length]; {
this.currentVertexBuffer = new ANX.Framework.Graphics.VertexBufferBinding[currentVertexBufferCount];
}
for (int i = 0; i < this.currentVertexBufferCount; i++)
{
this.currentVertexBuffer[i] = vertexBuffers[i];
}
Dx10.VertexBufferBinding[] nativeVertexBufferBindings = new Dx10.VertexBufferBinding[vertexBuffers.Length];
for (int i = 0; i < vertexBuffers.Length; i++) for (int i = 0; i < vertexBuffers.Length; i++)
{ {
ANX.Framework.Graphics.VertexBufferBinding anxVertexBufferBinding = vertexBuffers[i]; ANX.Framework.Graphics.VertexBufferBinding anxVertexBufferBinding = vertexBuffers[i];
@ -408,28 +436,53 @@ namespace ANX.RenderSystem.Windows.DX10
/// This method creates a InputLayout which is needed by DirectX 10 for rendering primitives. /// This method creates a InputLayout which is needed by DirectX 10 for rendering primitives.
/// The VertexDeclaration of ANX/XNA needs to be mapped to the DirectX 10 types. /// The VertexDeclaration of ANX/XNA needs to be mapped to the DirectX 10 types.
/// </summary> /// </summary>
private Dx10.InputLayout CreateInputLayout(Dx10.Device device, ShaderBytecode passSignature, private Dx10.InputLayout CreateInputLayout(Dx10.Device device, ShaderBytecode passSignature, params VertexDeclaration[] vertexDeclaration)
VertexDeclaration vertexDeclaration)
{ {
VertexElement[] vertexElements = vertexDeclaration.GetVertexElements(); //TODO: try to get rid of the list
int elementCount = vertexElements.Length; List<InputElement> inputElements = new List<InputElement>();
var inputElements = new Dx10.InputElement[elementCount]; foreach (VertexDeclaration decl in vertexDeclaration)
{
foreach (VertexElement vertexElement in decl.GetVertexElements())
{
inputElements.Add(CreateInputElementFromVertexElement(vertexElement, 0));
}
}
for (int i = 0; i < elementCount; i++) return new Dx10.InputLayout(device, passSignature, inputElements.ToArray());
inputElements[i] = CreateInputElementFromVertexElement(vertexElements[i]);
return new Dx10.InputLayout(device, passSignature, inputElements);
} }
private Dx10.InputLayout CreateInputLayout(Dx10.Device device, ShaderBytecode passSignature, params ANX.Framework.Graphics.VertexBufferBinding[] vertexBufferBindings)
{
//TODO: try to get rid of the list
List<InputElement> inputElements = new List<InputElement>();
int slot = 0;
foreach (ANX.Framework.Graphics.VertexBufferBinding binding in vertexBufferBindings)
{
foreach (VertexElement vertexElement in binding.VertexBuffer.VertexDeclaration.GetVertexElements())
{
inputElements.Add(CreateInputElementFromVertexElement(vertexElement, binding.InstanceFrequency, slot));
}
slot++;
}
// Layout from VertexShader input signature
return new InputLayout(device, passSignature, inputElements.ToArray());
}
#endregion #endregion
#region CreateInputElementFromVertexElement #region CreateInputElementFromVertexElement
private Dx10.InputElement CreateInputElementFromVertexElement(VertexElement vertexElement) private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement, int slot)
{ {
string elementName = DxFormatConverter.Translate(ref vertexElement); return CreateInputElementFromVertexElement(vertexElement, 0, slot);
Format elementFormat = DxFormatConverter.ConvertVertexElementFormat(vertexElement.VertexElementFormat); }
return new Dx10.InputElement(elementName, vertexElement.UsageIndex, elementFormat, vertexElement.Offset, 0);
} private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement, int instanceFrequency, int slot)
#endregion {
string elementName = DxFormatConverter.Translate(ref vertexElement);
Format elementFormat = DxFormatConverter.ConvertVertexElementFormat(vertexElement.VertexElementFormat);
return new InputElement(elementName, vertexElement.UsageIndex, elementFormat, vertexElement.Offset, slot, instanceFrequency == 0 ? InputClassification.PerVertexData : InputClassification.PerInstanceData, instanceFrequency);
}
#endregion
#region SetRenderTargets #region SetRenderTargets
public void SetRenderTargets(params RenderTargetBinding[] renderTargets) public void SetRenderTargets(params RenderTargetBinding[] renderTargets)

View File

@ -1,5 +1,6 @@
#region Using Statements #region Using Statements
using System; using System;
using System.Collections.Generic;
using ANX.Framework; using ANX.Framework;
using ANX.Framework.Graphics; using ANX.Framework.Graphics;
using ANX.Framework.NonXNA; using ANX.Framework.NonXNA;
@ -250,9 +251,28 @@ namespace ANX.RenderSystem.Windows.DX11
#endregion #endregion
#region DrawInstancedPrimitives #region DrawInstancedPrimitives
public void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, int instanceCount) public void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, int instanceCount, IndexBuffer indexBuffer)
{ {
nativeDevice.DrawIndexedInstanced(numVertices, instanceCount, startIndex, baseVertex, 0); SharpDX.Direct3D11.EffectTechnique technique = SetupEffectForDraw();
int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount);
nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType);
nativeDevice.Rasterizer.SetViewports(currentViewport);
nativeDevice.OutputMerger.SetTargets(this.depthStencilView, this.renderView);
if (indexBuffer != null)
{
SetIndexBuffer(indexBuffer);
}
for (int i = 0; i < technique.Description.PassCount; ++i)
{
technique.GetPassByIndex(i).Apply(nativeDevice);
nativeDevice.DrawIndexedInstanced(vertexCount, instanceCount, startIndex, baseVertex, 0);
}
nativeDevice.InputAssembler.InputLayout.Dispose();
nativeDevice.InputAssembler.InputLayout = null;
} }
#endregion // DrawInstancedPrimitives #endregion // DrawInstancedPrimitives
@ -360,9 +380,7 @@ namespace ANX.RenderSystem.Windows.DX11
private InputLayout SetupInputLayout(ShaderBytecode passSignature) private InputLayout SetupInputLayout(ShaderBytecode passSignature)
{ {
// get the VertexDeclaration from current VertexBuffer to create input layout for the input assembler // get the VertexDeclaration from current VertexBuffer to create input layout for the input assembler
//TODO: check for null and throw exception var layout = CreateInputLayout(nativeDevice.Device, passSignature, currentVertexBuffer);
VertexDeclaration vertexDeclaration = currentVertexBuffer.VertexDeclaration;
var layout = CreateInputLayout(nativeDevice.Device, passSignature, vertexDeclaration);
nativeDevice.InputAssembler.InputLayout = layout; nativeDevice.InputAssembler.InputLayout = layout;
return layout; return layout;
@ -394,7 +412,17 @@ namespace ANX.RenderSystem.Windows.DX11
if (vertexBuffers == null) if (vertexBuffers == null)
throw new ArgumentNullException("vertexBuffers"); throw new ArgumentNullException("vertexBuffers");
this.currentVertexBuffer = vertexBuffers[0].VertexBuffer; //TODO: hmmmmm, not nice :-) this.currentVertexBufferCount = vertexBuffers.Length;
if (this.currentVertexBuffer == null || this.currentVertexBuffer.Length < currentVertexBufferCount)
{
this.currentVertexBuffer = new ANX.Framework.Graphics.VertexBufferBinding[currentVertexBufferCount];
}
for (int i = 0; i < this.currentVertexBufferCount; i++)
{
this.currentVertexBuffer[i] = vertexBuffers[i].VertexBuffer;
}
var nativeVertexBufferBindings = new SharpDX.Direct3D11.VertexBufferBinding[vertexBuffers.Length]; var nativeVertexBufferBindings = new SharpDX.Direct3D11.VertexBufferBinding[vertexBuffers.Length];
for (int i = 0; i < vertexBuffers.Length; i++) for (int i = 0; i < vertexBuffers.Length; i++)
@ -425,26 +453,51 @@ namespace ANX.RenderSystem.Windows.DX11
#endregion #endregion
#region CreateInputLayout #region CreateInputLayout
private InputLayout CreateInputLayout(Device device, ShaderBytecode passSignature, VertexDeclaration vertexDeclaration) private InputLayout CreateInputLayout(Device device, ShaderBytecode passSignature, params VertexDeclaration[] vertexDeclaration)
{ {
VertexElement[] vertexElements = vertexDeclaration.GetVertexElements(); //TODO: try to get rid of the list
int elementCount = vertexElements.Length; List<InputElement> inputElements = new List<InputElement>();
InputElement[] inputElements = new InputElement[elementCount]; foreach (VertexDeclaration decl in vertexDeclaration)
{
foreach (VertexElement vertexElement in decl.GetVertexElements())
{
inputElements.Add(CreateInputElementFromVertexElement(vertexElement, 0));
}
}
for (int i = 0; i < elementCount; i++) return new InputLayout(device, passSignature, inputElements.ToArray());
inputElements[i] = CreateInputElementFromVertexElement(vertexElements[i]); }
private InputLayout CreateInputLayout(Device device, ShaderBytecode passSignature, params ANX.Framework.Graphics.VertexBufferBinding[] vertexBufferBindings)
{
//TODO: try to get rid of the list
List<InputElement> inputElements = new List<InputElement>();
int slot = 0;
foreach (ANX.Framework.Graphics.VertexBufferBinding binding in vertexBufferBindings)
{
foreach (VertexElement vertexElement in binding.VertexBuffer.VertexDeclaration.GetVertexElements())
{
inputElements.Add(CreateInputElementFromVertexElement(vertexElement, binding.InstanceFrequency, slot));
}
slot++;
}
// Layout from VertexShader input signature // Layout from VertexShader input signature
return new InputLayout(device, passSignature, inputElements); return new InputLayout(device, passSignature, inputElements.ToArray());
} }
#endregion #endregion
#region CreateInputElementFromVertexElement #region CreateInputElementFromVertexElement
private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement) private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement, int slot)
{
return CreateInputElementFromVertexElement(vertexElement, 0, slot);
}
private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement, int instanceFrequency, int slot)
{ {
string elementName = DxFormatConverter.Translate(ref vertexElement); string elementName = DxFormatConverter.Translate(ref vertexElement);
Format elementFormat = DxFormatConverter.ConvertVertexElementFormat(vertexElement.VertexElementFormat); Format elementFormat = DxFormatConverter.ConvertVertexElementFormat(vertexElement.VertexElementFormat);
return new InputElement(elementName, vertexElement.UsageIndex, elementFormat, vertexElement.Offset, 0); return new InputElement(elementName, vertexElement.UsageIndex, elementFormat, vertexElement.Offset, slot, instanceFrequency == 0 ? InputClassification.PerVertexData : InputClassification.PerInstanceData, instanceFrequency);
} }
#endregion #endregion