/// <summary> /// Vertex shader stage. /// </summary> private void StageVertexShader(TVertexIn[] vertices, PrimitiveTopology primitiveTopology) { var verticesVsOut = new TVertex[vertices.Length]; for (var i = 0; i < vertices.Length; i++) { verticesVsOut[i] = Shader.VertexShader(vertices[i]); } StageVertexPostProcessing(verticesVsOut, primitiveTopology); }
/// <summary> /// Vertex post-processing stage. /// </summary> private void StageVertexPostProcessing(TVertex[] vertices, PrimitiveTopology primitiveTopology) { switch (primitiveTopology) { case PrimitiveTopology.PointList: for (var i = 0; i < vertices.Length; i++) { VertexPostProcessingPoint(vertices[i]); } break; case PrimitiveTopology.LineList: for (var i = 0; i < vertices.Length; i += 2) { VertexPostProcessingLine(vertices[i], vertices[i + 1]); } break; case PrimitiveTopology.LineStrip: for (var i = 0; i < vertices.Length - 1; i++) { VertexPostProcessingLine(vertices[i], vertices[i + 1]); } break; case PrimitiveTopology.TriangleList: for (var i = 0; i < vertices.Length; i += 3) { VertexPostProcessingTriangle(vertices[i], vertices[i + 1], vertices[i + 2]); } break; case PrimitiveTopology.TriangleStrip: for (var i = 0; i < vertices.Length - 2; i++) { VertexPostProcessingTriangle(vertices[i], vertices[i + 1], vertices[i + 2]); } break; default: throw new ArgumentOutOfRangeException(nameof(primitiveTopology), primitiveTopology, null); } }
/// <inheritdoc /> public void Render(TVertexIn[] vertices, PrimitiveTopology primitiveTopology) { StageVertexShader(vertices, primitiveTopology); }