渲染一个基本的四边形到屏幕?
Render a basic Quad to Screen?
我已经尝试了很长一段时间但没有成功;我在 Whosebug 上查看了几个相关问题但没有成功;我还遵循了 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
。
现在,这让我感到困惑的原因是我可以渲染更高级的对象,例如:
- 球体
- 3D 线
- 粉丝
我创建四边形的代码与其他人的几乎相同:
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
硬连线到一些我现在还无法摆脱的地方);如果这有帮助,我目前无法转换为左手坐标系。
我是不是漏掉了什么?为什么我无法渲染基本四边形?
如果您觉得需要更多信息,请随时告诉我,我会根据要求添加。
使用 Direct3D 11 进行渲染时,您需要了解所有状态。您没有在此处提及您的 BlendState、DepthStencilState 或 RasterState 设置,这可能是您没有获得所需结果的原因。
如果 DepthStencilState 是这样设置的,请使用 Z-Buffer,那么您的顶点的 Z 为 0 的事实意味着它们将被剔除。您可以在没有 Z 写入或 Z 测试的情况下设置 depth/stencil 状态,并且无论如何在绘制 2D 东西时绝对应该关闭 Z 写入。您还可以为顶点的 Z 值传递类似 0.5
的内容,这对于使用 3D API 的 2D 绘图来说是相当常见的。
如果您在 RasterState 中启用了背面剔除,那么您的顶点的缠绕顺序可能会导致它们被跳过。您可以玩不同的缠绕顺序,或禁用剔除。
这里的顶点着色器和像素着色器也很重要。您没有显示用于设置着色器或着色器常量的代码,也没有显示 HLSL。
您应该认真考虑使用 SharpDX Toolkit SpriteBatch
class for efficient quad rendering or looking at their source for it。
I know you are using SharpDX an C#, but you might find it useful to see the DirectX Tool Kit for DX11 tutorial on drawing 2D shapes.
我已经尝试了很长一段时间但没有成功;我在 Whosebug 上查看了几个相关问题但没有成功;我还遵循了 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
。
现在,这让我感到困惑的原因是我可以渲染更高级的对象,例如:
- 球体
- 3D 线
- 粉丝
我创建四边形的代码与其他人的几乎相同:
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
硬连线到一些我现在还无法摆脱的地方);如果这有帮助,我目前无法转换为左手坐标系。
我是不是漏掉了什么?为什么我无法渲染基本四边形?
如果您觉得需要更多信息,请随时告诉我,我会根据要求添加。
使用 Direct3D 11 进行渲染时,您需要了解所有状态。您没有在此处提及您的 BlendState、DepthStencilState 或 RasterState 设置,这可能是您没有获得所需结果的原因。
如果 DepthStencilState 是这样设置的,请使用 Z-Buffer,那么您的顶点的 Z 为 0 的事实意味着它们将被剔除。您可以在没有 Z 写入或 Z 测试的情况下设置 depth/stencil 状态,并且无论如何在绘制 2D 东西时绝对应该关闭 Z 写入。您还可以为顶点的 Z 值传递类似
0.5
的内容,这对于使用 3D API 的 2D 绘图来说是相当常见的。如果您在 RasterState 中启用了背面剔除,那么您的顶点的缠绕顺序可能会导致它们被跳过。您可以玩不同的缠绕顺序,或禁用剔除。
这里的顶点着色器和像素着色器也很重要。您没有显示用于设置着色器或着色器常量的代码,也没有显示 HLSL。
您应该认真考虑使用 SharpDX Toolkit SpriteBatch
class for efficient quad rendering or looking at their source for it。
I know you are using SharpDX an C#, but you might find it useful to see the DirectX Tool Kit for DX11 tutorial on drawing 2D shapes.