我一直在努力完成这项工作,但没有成功;我已经在StackOverflow上查看了几个相关的问题,但都没有成功;我还遵循了6个不同的教程,所有这些教程几乎都遵循相同的过程:
-1, -1, 0
,-1, 1, 0
,1, 1, 0
和1, -1, 0
。0, 1, 2, 0, 2, 3
。Vertex
和Index
缓冲区。RenderTargetView
。Vertex
和Pixel
着色器。4 - 8
。现在,这把我引到墙上的原因是因为我可以渲染更高级的对象,例如:
我创建四边形的代码与其他所有人的代码几乎相同:
public class Quad {
private void SetVertices() {
float width = Rescale(Size.Width, 0, Application.Width, -1, 1);
float height = Rescale(Size.Height, 0, Application.Height, -1, 1);
vertices = new Vertex[] {
new Vertex(new Vector3(-width, -height, 0), Vector3.ForwardLH, Color.White),
new Vertex(new Vector3(-width, height, 0), Vector3.ForwardLH, Color.White),
new Vertex(new Vector3(width, height, 0), Vector3.ForwardLH, Color.White),
new Vertex(new Vector3(width, -height, 0), Vector3.ForwardLH, Color.White)
}
indices = new int[] { 0, 1, 2, 0, 2, 3 };
vertexBuffer = Buffer.Create(Device3D, BindFlags.VertexBuffer, vertices);
vertexBinding = new VertexBufferBinding(vertexBuffer, Utilities.SIzeOf<Vertex>(), 0);
indexBuffer = Buffer.Create(Device3D, BindFlags.IndexBuffer, indices);
indexCount = indices.Length;
}
public void Render() {
if (shaderResourceView != null)
context3D.PixelShader.SetShaderResource(0, shaderResourceView);
context3D.PixelShader.SetSampler(0, samplerState);
context3D.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleStrip;
context3D.InputAssembler.SetVertexBuffers(0, vertexBinding);
context3D.InputAssembler.SetIndexBuffer(indexBuffer, Format.R32_UInt, 0);
context3D.DrawIndexed(totalIndexCount, 0, 0);
}
}
我使用的是右手坐标系(由于某些原因,以前的开发人员将Vector3.ForwardLH
硬连线到了我现在无法摆脱的某些地方);如果有帮助,我目前无法转换为左手坐标系。
我在这里错过了什么吗?为什么我无法渲染基本四边形?
如果您需要更多信息,请随时告诉我,我将根据要求添加。
答案 0 :(得分:1)
使用Direct3D 11渲染时,您需要了解所有状态。您不会提及这里的BlendState,DepthStencilState或RasterState设置,这可能是您无法获得所需结果的原因。
如果DepthStencilState这样设置,则使用Z缓冲区,那么您的顶点的Z值为0的事实意味着它们将被剔除。您可以在没有Z写或Z测试的情况下设置深度/模板状态,并且无论如何绘制2D素材时,您绝对应该关闭Z写。您还可以为顶点的Z值传递类似0.5
的值,这对于使用3D API进行2D绘图来说是很常见的。
如果在RasterState中启用了背面剔除,则顶点的缠绕顺序可能会导致其被跳过。您可以使用不同的缠绕顺序,也可以禁用淘汰。
这真的很重要,您的Vertex Shader和Pixel Shader在这里。您不会显示用于设置着色器或着色器常量的代码,也不会显示HLSL。
您应该认真考虑使用SharpDX Toolkit SpriteBatch
类进行高效的四边形渲染或查看其source for it。
我知道您在使用SharpDX和C#,但是您可能会发现查看DirectX Tool Kit for DX11绘制2D形状的教程很有用。