/// <summary> /// 用随机颜色更新当前的颜色。 /// </summary> public void UpdateColorBuffer() { var colorArray = new UnmanagedArray<vec3>(size * size * size * 8); Random random = new Random(); int index = 0; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { for (int k = 0; k < size; k++) { //vec3 color = new vec3((float)random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble()); for (int cubeIndex = 0; cubeIndex < 8; cubeIndex++) { vec3 color = new vec3((float)random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble()); colorArray[index++] = color; } } } } // update buffer object. GL.BindBuffer(BufferTarget.ArrayBuffer, this.colorBuffer[0]); IntPtr destColors = GL.MapBuffer(BufferTarget.ArrayBuffer, MapBufferAccess.ReadWrite); colorArray.CopyTo(destColors); GL.UnmapBuffer(BufferTarget.ArrayBuffer); // This do the same thing: update buffer object using (var mappingBuffer = new MappingBuffer(BufferTarget.ArrayBuffer, this.colorBuffer[0], MapBufferAccess.ReadWrite)) { colorArray.CopyTo(mappingBuffer.BufferPointer); } colorArray.Dispose(); }
private void DoRender(object sender, PaintEventArgs e) { // Compute the MVP (Model View Projection matrix) { GL.BindBuffer(BufferTarget.UniformBuffer, BufferName[1]);//BufferName[TRANSFORM] var Pointer = GL.MapBufferRange(GL.GL_UNIFORM_BUFFER, 0, 64, (uint)(GL.GL_MAP_WRITE_BIT | GL.GL_MAP_INVALIDATE_BUFFER_BIT)); var tmp = new UnmanagedArray<mat4>(1); mat4 projection = this.camera.GetProjectionMat4(); mat4 view = this.camera.GetViewMat4(); tmp[0] = projection * view; tmp.CopyTo(Pointer); GL.UnmapBuffer(GL.GL_UNIFORM_BUFFER); tmp.Dispose(); } // Clear color buffer //GL.ClearBufferfv(GL_COLOR, 0, &GL.m.vec4(0.0f, 0.0f, 0.0f, 1.0f)[0]); GL.ClearBuffer(GL.GL_COLOR, 0, new float[] { 0.0f, 0.0f, 0.0f, 1.0f }); // First draw, capture the attributes // Disable rasterisation, vertices processing only! GL.Enable(GL.GL_RASTERIZER_DISCARD); transformProgram.Bind(); GL.BindVertexArray(transformArray[0]); //GL.BindBufferBase(GL.GL_UNIFORM_BUFFER, semantic.uniform.TRANSFORM0, BufferName[buffer.TRANSFORM]); GL.BindBufferBase(GL.GL_UNIFORM_BUFFER, 1, BufferName[1]); GL.BindTransformFeedback(GL.GL_TRANSFORM_FEEDBACK, feedbackObj[0]); GL.BeginTransformFeedback(GL.GL_TRIANGLES); GL.DrawArraysInstanced(GL.GL_TRIANGLES, 0, 6, 1);//VertexCount: 6 GL.EndTransformFeedback(); GL.BindTransformFeedback(GL.GL_TRANSFORM_FEEDBACK, 0); GL.Disable(GL.GL_RASTERIZER_DISCARD); // Second draw, reuse the captured attributes feedbackProgram.Bind(); GL.BindVertexArray(feedbackArray[0]); GL.DrawTransformFeedback(GL.GL_TRIANGLES, feedbackObj[0]); }