使用OpenTK设置顶点属性

时间:2015-01-24 23:32:57

标签: opengl glsl shader vbo opentk

我在设置着色器时设置位置,法线和纹理坐标属性时遇到问题。我正在使用meshomatic加载obj文件,以下是将属性添加到单个vbo的方式:

        void LoadBuffers(MeshData m)
    {
        float[] verts, norms, texcoords;
        uint[] indices;
        m.OpenGLArrays(out verts, out norms, out texcoords, out indices);
        GL.GenBuffers(1, out dataBuffer);
        GL.GenBuffers(1, out indexBuffer);

        // Set up data for VBO.
        // We're going to use one VBO for all geometry, and stick it in 
        // in (VVVVNNNNCCCC) order.  Non interleaved.
        int buffersize = (verts.Length + norms.Length + texcoords.Length);
        float[] bufferdata = new float[buffersize];
        vertOffset = 0;
        normOffset = verts.Length;
        texcoordOffset = (verts.Length + norms.Length);

        verts.CopyTo(bufferdata, vertOffset);
        norms.CopyTo(bufferdata, normOffset);
        texcoords.CopyTo(bufferdata, texcoordOffset);

        bool v = false;
        for (int i = texcoordOffset; i < bufferdata.Length; i++)
        {
            if (v)
            {
                bufferdata[i] = 1 - bufferdata[i];
                v = false;
            }
            else
            {
                v = true;
            }
        }

        // Load geometry data
        GL.BindBuffer(BufferTarget.ArrayBuffer, dataBuffer);
        GL.BufferData<float>(BufferTarget.ArrayBuffer, (IntPtr)(buffersize * sizeof(float)), bufferdata,
                      BufferUsageHint.StaticDraw);

        // Load index data
        GL.BindBuffer(BufferTarget.ElementArrayBuffer, indexBuffer);
        GL.BufferData<uint>(BufferTarget.ElementArrayBuffer,
                      (IntPtr)(indices.Length * sizeof(uint)), indices, BufferUsageHint.StaticDraw);
    }

以下是我的绘画方式:

        void DrawBuffer()
    {
        // Push current Array Buffer state so we can restore it later
        GL.PushClientAttrib(ClientAttribMask.ClientVertexArrayBit);

        GL.ClientActiveTexture(TextureUnit.Texture0);
        GL.BindTexture(TextureTarget.Texture2D, diff);

        GL.EnableVertexAttribArray(positionIndex);
        GL.BindBuffer(BufferTarget.ArrayBuffer, dataBuffer);
        GL.VertexAttribPointer(positionIndex, 3, VertexAttribPointerType.Float, false, 0, vertOffset);

        GL.EnableVertexAttribArray(texcoordIndex);
        GL.BindBuffer(BufferTarget.ArrayBuffer, dataBuffer);
        GL.VertexAttribPointer(texcoordIndex, 2, VertexAttribPointerType.Float, false, 0, texcoordOffset);

        GL.EnableVertexAttribArray(normalIndex);
        GL.BindBuffer(BufferTarget.ArrayBuffer, dataBuffer);
        GL.VertexAttribPointer(normalIndex, 3, VertexAttribPointerType.Float, false, 0, normOffset);

        // Index array
        GL.BindBuffer(BufferTarget.ElementArrayBuffer, indexBuffer);
        GL.DrawElements(PrimitiveType.Triangles, m.Tris.Length * 3, DrawElementsType.UnsignedInt, IntPtr.Zero);

        // Restore the state
        GL.PopClientAttrib();
    }

然而我的纹理坐标是错误的。似乎我的纹理中只有一个像素用于覆盖整个obj。我想我正在使用GL.VertexAttribPointer(...)。什么是第二个arg int“大小”?

0 个答案:

没有答案