コード例 #1
0
ファイル: QuadBuffers.cs プロジェクト: zhqanddcy/CSharpGL
        public void Init(float[] vertices)
        {
            GCHandle pinned = GCHandle.Alloc(vertices, GCHandleType.Pinned);
            IntPtr   header = Marshal.UnsafeAddrOfPinnedArrayElement(vertices, 0);
            int      length = vertices.Length;
            var      array  = new TempUnmanagedArray <float>(header, length);// It's not necessary to call Dispose() for this unmanaged array.

            glGenVertexArrays(1, cubeVAOs);
            glGenBuffers(1, cubeVBOs);
            // fill buffer
            glBindBuffer(GL.GL_ARRAY_BUFFER, cubeVBOs[0]);
            glBufferData(GL.GL_ARRAY_BUFFER, array.ByteLength, array.Header, GL.GL_STATIC_DRAW);
            // link vertex attributes
            glBindVertexArray(cubeVAOs[0]);
            glEnableVertexAttribArray(0);
            glVertexAttribPointer(0, 3, GL.GL_FLOAT, false, 5 * sizeof(float), IntPtr.Zero);
            glEnableVertexAttribArray(1);
            glVertexAttribPointer(1, 2, GL.GL_FLOAT, false, 5 * sizeof(float), new IntPtr(3 * sizeof(float)));
            glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
            glBindVertexArray(0);
            pinned.Free();
        }
コード例 #2
0
ファイル: SphereBuffers.cs プロジェクト: zhqanddcy/CSharpGL
        public void Init(float[] bufferData, uint[] indices)
        {
            this.indexCount = indices.Length;

            glGenVertexArrays(1, vaos);
            // fill buffer
            {
                GCHandle pinned = GCHandle.Alloc(bufferData, GCHandleType.Pinned);
                IntPtr   header = Marshal.UnsafeAddrOfPinnedArrayElement(bufferData, 0);
                var      array  = new TempUnmanagedArray <float>(header, bufferData.Length);// It's not necessary to call Dispose() for this unmanaged array.
                glGenBuffers(1, vbos);
                glBindBuffer(GL.GL_ARRAY_BUFFER, vbos[0]);
                glBufferData(GL.GL_ARRAY_BUFFER, array.ByteLength, array.Header, GL.GL_STATIC_DRAW);
                pinned.Free();
            }
            {
                GCHandle pinned = GCHandle.Alloc(indices, GCHandleType.Pinned);
                IntPtr   header = Marshal.UnsafeAddrOfPinnedArrayElement(indices, 0);
                var      array  = new TempUnmanagedArray <uint>(header, indices.Length);// It's not necessary to call Dispose() for this unmanaged array.
                glGenBuffers(1, ibos);
                glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, ibos[0]);
                glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, array.ByteLength, array.Header, GL.GL_STATIC_DRAW);
                pinned.Free();
            }
            {
                int stride = (3 + 2 + 3) * sizeof(float);
                // link vertex attributes
                glBindVertexArray(vaos[0]);
                glBindBuffer(GL.GL_ARRAY_BUFFER, vbos[0]);
                glEnableVertexAttribArray(0);
                glVertexAttribPointer(0, 3, GL.GL_FLOAT, false, stride, IntPtr.Zero);
                glEnableVertexAttribArray(1);
                glVertexAttribPointer(1, 2, GL.GL_FLOAT, false, stride, new IntPtr(3 * sizeof(float)));
                glEnableVertexAttribArray(1);
                glVertexAttribPointer(2, 3, GL.GL_FLOAT, false, stride, new IntPtr(5 * sizeof(float)));
                glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
                glBindVertexArray(0);
            }
        }