C# 将基本四边形渲染到屏幕?
我已经尝试了很长一段时间,但没有成功;我在StackOverflow上研究了几个相关问题,但没有成功;我还学习了6个不同的教程,它们都遵循了几乎相同的过程:C# 将基本四边形渲染到屏幕?,c#,directx-11,sharpdx,C#,Directx 11,Sharpdx,我已经尝试了很长一段时间,但没有成功;我在StackOverflow上研究了几个相关问题,但没有成功;我还学习了6个不同的教程,它们都遵循了几乎相同的过程: 构建顶点:-1,-1,0,-1,1,0,1,1,0,以及1,-1,0 建立索引:0,1,2,0,2,3 创建顶点和索引缓冲区 清除渲染目标视图 设置当前的顶点和像素着色器 如果有常量缓冲区,请更新它们 渲染四边形(请参见下文) 冲洗并重复4-8 现在,这让我抓狂的原因是我可以渲染更高级的对象,例如: 球体 三维线条 扇子 我创建四边形
-1,-1,0
,-1,1,0
,1,1,0
,以及1,-1,0
0,1,2,0,2,3
顶点
和索引
缓冲区渲染目标视图
顶点
和像素
着色器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);
}
}
公共类四元组{
私有void SetVertices(){
浮动宽度=重新缩放(Size.width,0,Application.width,-1,1);
浮动高度=重新缩放(Size.height,0,Application.height,-1,1);
顶点=新顶点[]{
新顶点(新矢量3(-width,-height,0),矢量3.lh,Color.White),
新顶点(新矢量3(-width,height,0),矢量3.lh,Color.White),
新顶点(新矢量3(宽度、高度、0)、矢量3.lh、颜色、白色),
新顶点(新矢量3(宽度,-高度,0),矢量3.LH,颜色。白色)
}
索引=新的int[]{0,1,2,0,2,3};
vertexBuffer=Buffer.Create(Device3D,BindFlags.vertexBuffer,顶点);
vertexBinding=新的VertexBufferBinding(vertexBuffer,Utilities.SIzeOf(),0);
indexBuffer=Buffer.Create(Device3D,BindFlags.indexBuffer,index);
indexCount=指数长度;
}
公共无效呈现(){
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);
DrawIndexed(totalIndexCount,0,0);
}
}
笔记 我使用右手坐标系(出于某种原因,以前的开发人员将
Vector3.ForwardLH
硬连线到一些我现在还无法摆脱的地方);如果有任何帮助,我目前无法转换为左手坐标系
我是不是遗漏了什么?为什么我无法渲染基本四边形
如果您觉得需要更多信息,请随时通知我,我将根据要求添加。使用Direct3D 11进行渲染时,您需要了解所有状态。您没有在此处提及BlendState、DepthStencilState或RasterState设置,这可能是您无法获得所需结果的原因
- 如果DepthStencilState是这样设置的,请使用Z缓冲区,那么顶点的Z值为0这一事实意味着它们将被剔除。您可以在不进行Z写入或Z测试的情况下设置深度/模具状态,并且无论如何,在绘制2D内容时,您都应该明确关闭Z写入。您还可以为顶点传递类似于
的Z值,这在使用3D API的2D绘图中非常常见0.5
- 如果在RasterState中启用背面消隐,则顶点的缠绕顺序可能会导致跳过它们。您可以使用不同的缠绕顺序,或禁用剔除