我正在尝试使用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
有没有人知道我做错了什么?
答案 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编写的着色器。
如果要使用已弃用的固定管道,则必须使用固定函数顶点属性,调用glVertexPointer
和glEnableClientState
等函数,而不是glVertexAttribPointer
和glEnableVertexAttribArray
有时你可以将两者混合起来,特别是只要你只使用一个属性作为位置。但是,一旦开始使用其他属性,例如此方法,您可能会遇到问题。对于法线或颜色。当使用没有着色器的通用顶点属性时,在不同平台上也可能存在不同的行为。