go+SDL+OpenGL+MacOS示例=我在DrawArrays()之后得到无效的_操作

go+SDL+OpenGL+MacOS示例=我在DrawArrays()之后得到无效的_操作,macos,go,opengl,sdl,Macos,Go,Opengl,Sdl,SDL版本:2.0.12 OpenGL版本:3.3英特尔-10.4.14 我必须通过请求core概要文件将OpenGL版本强制到3.3,否则我得到的默认版本是1.2 在Go游戏的视频教程之后,我尝试了OpenGL示例代码,它只显示了一个黑色窗口。 它应该渲染一个橙色三角形 在倒数第二个语句gl.DrawArraysgl.TRIANGLES,0,3之后,我得到了无效的\u操作 包干管 进口 fmt 串 github.com/go-gl/gl/v3.3-core/gl github.com/vean

SDL版本:2.0.12 OpenGL版本:3.3英特尔-10.4.14 我必须通过请求core概要文件将OpenGL版本强制到3.3,否则我得到的默认版本是1.2

在Go游戏的视频教程之后,我尝试了OpenGL示例代码,它只显示了一个黑色窗口。 它应该渲染一个橙色三角形

在倒数第二个语句gl.DrawArraysgl.TRIANGLES,0,3之后,我得到了无效的\u操作

包干管 进口 fmt 串 github.com/go-gl/gl/v3.3-core/gl github.com/veandco/go-sdl2/sdl func DONTPANICER错误{ 如果错误!=零{ 圆锥花序 } } var GLversion=[…]int{3,3} func main{ 陆离 sdl.Initsdl.INIT_一切 推迟sdl。退出 陆离 sdl.GLSetAttributesdl.GL_上下文_概要文件_掩码,sdl.GL_上下文_概要文件_核心 陆离 sdl.GLSetAttributesdl.GL_上下文_主要版本,GLversion[0] 陆离 sdl.GLSetAttributesdl.GL_上下文_次要_版本,GLversion[1] 窗口,错误:=sdl.CreateWindowOpenGL,2002001280720,sdl.window\u OPENGL 唐特帕尼瑟 window.GLCreateContext 延迟窗口。销毁 GLversionStr:=fmt.Sprintf%d%d0,GLversion[0],GLversion[1] 总账初始化 版本:=gl.GoStrgl.GetStringgl.version fmt.printlOpenGL版本,版本 顶点着色器RC:= version+GLversionStr+core\n+ 布局位置=0(在vec3 aPos中)+ 真空总管{+ gl_位置=vec4aPos.x,aPos.y,aPos.z,1.0+ }\x00 vertexShader:=gl.CreateShadergl.VERTEX_着色器 csource,free:=gl.StrsvertexShaderSrc gl.ShaderSourcevertexShader,1,csource,无 自由的 gl.CompileShadervertexShader var状态int32 gl.getshaderivertexshader、gl.COMPILE\u状态和状态 如果状态==gl.FALSE{ 变量logLength int32 gl.GetShaderivvertexShader、gl.INFO\u LOG\u LENGTH和logLength 日志:=字符串。重复\x00,intlogLength+1 gl.GetShaderInfoLogvertexShader,logLength,nil,gl.Strlog 无法编译顶点着色器:\n+log } 碎片着色器rc:= version+GLversionStr+core\n+ out vec4 FragColor+ 真空总管{+ FragColor=vec41,0.5,0.2,1+ }\x00 fragmentShader:=gl.CreateShadergl.FRAGMENT\u着色器 csource,free=gl.StrsfragmentShaderSrc gl.ShaderSourcefragmentShader,1,csource,无 自由的 gl.CompileShaderfragmentShader gl.GetShaderivfragmentShader、gl.COMPILE\u状态和状态 如果状态==gl.FALSE{ 变量logLength int32 gl.GetShaderivfragmentShader、gl.INFO\u LOG\u LENGTH和logLength 日志:=字符串。重复\x00,intlogLength+1 gl.GetShaderInfoLogfragmentShader,logLength,nil,gl.Strlog 无法编译片段着色器:\n+log } shaderPrg:=gl.CreateProgram gl.AttachShaderShaderShaderPrg,顶点着色器 gl.AttachSHADERSHADERSHADERPRG,碎片着色器 gl.LinkProgramshaderPrg gl.GetProgramivshaderPrg、gl.LINK\u状态和状态 如果状态==gl.FALSE{ 链接器中出现错误,尚未实现错误日志记录。 } gl.deleteShaderTextShader gl.DeleteShaderfragmentShader 顶点:=[]浮动32{ -.5, -.5, 0, .5, -.5, 0, 0, .5, 0, } var vertexBuffer uint32 gl.GenBuffers1和vertexBuffer gl.BindBuffergl.ARRAY\u缓冲区,顶点缓冲区 可变顶点阵列uint32 gl.GenVertexArray 1和vertexArray gl.BindVertexArrayvertexArray gl.BufferDatagl.ARRAY_缓冲区,透镜顶点*4,gl.Ptrvertices,gl.STATIC_绘图 gl.VertexAttributePointer0,3,gl.FLOAT,false,3*4,无 gl.EnableVertexAttribute属性0 gl.BindVertexArray0 事件投票: 为了{ 对于事件:=sdl.PollEvent;事件!=nil;事件=sdl.PollEvent{ 开关事件类型{ 案例*sdl.QuitEvent: 中断事件投票 } } gl.ClearColor0,0,0,0 gl.Cleargl.COLOR\u缓冲位 gl.BindVertexArrayvertexArray gl.DrawArraysgl.TRIANGLES,0,3 window.GLSwap } }
您的代码从不调用glUseProgram,这意味着您尝试在没有当前程序对象的情况下绘制,这在core profile OpenGL中无效。

哦,对了,教程不使用core,所以他们可能不会使用它。是的,就是这样,谢谢!好吧,即使教程没有使用core profile,它也应该激活着色器。固定功能管道在 其默认状态将以相同的顶点变换结束,但FS中定义的颜色不会以这种方式显示。