如何用VBO和F#绘制三角形

时间:2014-08-29 09:56:38

标签: .net opengl f# opentk

我正在尝试使用OpenTK和VBO绘制三角形。

但是唯一出现的是棕色背景。

open System
open OpenTK
open OpenTK.Graphics.OpenGL4
open OpenTK.Graphics

type Window(width, height, mode, title, options) =
    inherit GameWindow(width, height, mode, title, options)

    let mutable buffers :int = 0


    let createVertexBuffer =
        let vertices = 
            [|
                new Vector3(-1.f,-1.f,0.f)
                new Vector3(1.f,-1.f,0.f)
                new Vector3(0.f,-1.f,0.f)
            |]
        buffers <- GL.GenBuffer()
        GL.BindBuffer(BufferTarget.ArrayBuffer, buffers)
        GL.BufferData(BufferTarget.ArrayBuffer, new IntPtr(vertices.Length * Vector3.SizeInBytes), vertices, BufferUsageHint.StaticDraw)

    // Function for initialization.
    override this.OnLoad(e) =
        // The background will just cleared with blue color.
        base.OnLoad(e)
        //GL.ClearColor(0.0f, 0.0f, 0.0f, 0.0f)
        GL.ClearColor(Color4.Brown)
        //GL.Enable(EnableCap.DepthTest)
        createVertexBuffer


    // Function is called before first update and every time when the window is resized.
    override this.OnResize(e) =
        GL.Viewport(0, 0, this.Width, this.Height)
        base.OnResize(e)

    // Function to render and display content. 
    override this.OnRenderFrame(e) =
        base.OnRenderFrame(e)
        GL.Clear(ClearBufferMask.ColorBufferBit)
        GL.Clear(ClearBufferMask.DepthBufferBit)

        GL.EnableVertexAttribArray(0)
        GL.BindBuffer(BufferTarget.ArrayBuffer, buffers)
        GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 0, 0)
        GL.DrawArrays(PrimitiveType.Triangles, 0, 3)

        GL.DisableVertexAttribArray(0)

        // Swap the front and back buffers
        this.Context.SwapBuffers()

[<EntryPoint>]
let main argv = 
    use window = new Window(640, 480, Graphics.GraphicsMode.Default, "Example Window", GameWindowFlags.Default)
    window.Run()
    0  

有没有人知道我做错了什么?

1 个答案:

答案 0 :(得分:1)

您尝试渲染退化三角形:

    let vertices = 
        [|
            new Vector3(-1.f,-1.f,0.f)
            new Vector3(1.f,-1.f,0.f)
            new Vector3(0.f,-1.f,0.f)
        |]

请注意,y坐标和z坐标对于所有3个顶点都是相同的,这意味着所有3个点都在一条直线上。 OpenGL不会为退化三角形渲染任何像素。你可能想要这样的东西:

    let vertices = 
        [|
            new Vector3(-1.f,-1.f,0.f)
            new Vector3(1.f,-1.f,0.f)
            new Vector3(0.f,1.f,0.f)
        |]

另一个方面看起来风险最小,除非您使用的OpenGL绑定(我不熟悉)正在为您神奇地处理这个问题。您使用的是通用顶点属性,但我没有看到任何着色器。如果您使用通用顶点属性,通常必须提供自己用GLSL编写的着色器。

如果要使用已弃用的固定管道,则必须使用固定函数顶点属性,调用glVertexPointerglEnableClientState等函数,而不是glVertexAttribPointerglEnableVertexAttribArray

有时你可以将两者混合起来,特别是只要你只使用一个属性作为位置。但是,一旦开始使用其他属性,例如此方法,您可能会遇到问题。对于法线或颜色。当使用没有着色器的通用顶点属性时,在不同平台上也可能存在不同的行为。