class CubeModel : IBufferSource { private const float halfLength = 0.5f; private static readonly vec3[] positions = new vec3[] { new vec3(+halfLength, +halfLength, +halfLength), // 0 new vec3(+halfLength, +halfLength, -halfLength), // 1 new vec3(+halfLength, -halfLength, +halfLength), // 2 new vec3(+halfLength, -halfLength, -halfLength), // 3 new vec3(-halfLength, +halfLength, +halfLength), // 4 new vec3(-halfLength, +halfLength, -halfLength), // 5 new vec3(-halfLength, -halfLength, +halfLength), // 6 new vec3(-halfLength, -halfLength, -halfLength), // 7 }; private static readonly uint[] indexes = new uint[] { 0, 2, 1, 1, 2, 3, // +X faces. 0, 1, 5, 0, 5, 4, // +Y faces. 0, 4, 2, 2, 4, 6, // +Z faces. 7, 6, 4, 7, 4, 5, // -X faces. 7, 5, 3, 3, 5, 1, // -Z faces. 7, 3, 2, 7, 2, 6, // -Y faces. }; public const string strPosition = "position"; private VertexBuffer positionBuffer; // array in GPU side. private IDrawCommand drawCommand; #region IBufferSource 成员 public IEnumerable<VertexBuffer> GetVertexAttribute(string bufferName) { if (strPosition == bufferName) // requiring position buffer. { if (this.positionBuffer == null) { // transform managed array to vertex buffer. this.positionBuffer = positions.GenVertexBuffer( VBOConfig.Vec3, // mapping to 'in vec3 someVar;' in vertex shader. BufferUsage.StaticDraw); // GL_STATIC_DRAW. } yield return this.positionBuffer; } else { throw new ArgumentException("bufferName"); } } public IEnumerable<IDrawCommand> GetDrawCommand() { if (this.drawCommand == null) { // indexes in GPU side. IndexBuffer indexBuffer = indexes.GenIndexBuffer(BufferUsage.StaticDraw); this.drawCommand = new DrawElementsCmd(indexBuffer, DrawMode.Triangles); // GL_TRIANGLES. } yield return this.drawCommand; } #endregion }逐行解释上述程序
时间: 2023-06-14 19:07:10 浏览: 115
这段程序定义了一个名为 CubeModel 的类,它实现了接口 IBufferSource,表示它可以提供 GPU 缓冲区数据。类中定义了一个静态的 float 类型变量 halfLength,它表示立方体边长的一半,以及一个静态的 vec3 类型数组 positions,它包含了立方体的 8 个顶点的坐标。还定义了一个静态的 uint 类型数组 indexes,它包含了构成立方体的 6 个面的索引数据。
接着,类中实现了 IBufferSource 接口的两个方法:GetVertexAttribute 和 GetDrawCommand。GetVertexAttribute 方法接受一个字符串参数 bufferName,如果参数等于 "position",则返回 positionBuffer,它是 positions 数组的映射到 GPU 端的缓冲区;如果参数不等于 "position",则抛出 ArgumentException 异常。GetDrawCommand 方法返回一个 DrawElementsCmd 对象,表示绘制立方体的指令。
在 CubeModel 类中,还定义了一个常量字符串 strPosition,它的值是 "position"。还有一个 VertexBuffer 类型的变量 positionBuffer,表示 position 缓冲区数据在 GPU 端的映射。还有一个 IDrawCommand 类型的变量 drawCommand,表示绘制立方体的命令。
阅读全文