簡體   English   中英

go + SDL + OpenGL + MacOS 示例 = 我在 DrawArrays() 之后得到 INVALID_OPERATION

[英]go + SDL + OpenGL + MacOS example = I get INVALID_OPERATION after DrawArrays()

SDL 版本:2.0.12
OpenGL 版本:3.3 INTEL-10.4.14
我不得不通過請求核心配置文件將 OpenGL 版本強制為 3.3,否則我將獲得的默認版本是 1.2

Following this video tutorial http://youtu.be/yxAPS2eyKmA Games with Go , I tried the OpenGL sample code, and it just shows a black window.
它應該呈現一個橙色三角形。

在倒數第二個語句gl.DrawArrays(gl.TRIANGLES, 0, 3)之后,我得到了INVALID_OPERATION

https://gist.github.com/ErnestoBorio/87b09bf3cc496657a83637fd4876e943

    package main

    import (
        "fmt"
        "strings"

        "github.com/go-gl/gl/v3.3-core/gl"
        "github.com/veandco/go-sdl2/sdl"
    )

    func DontPanic(err error) {
        if err != nil {
            panic(err)
        }
    }

    var GLversion = [...]int {3, 3}

    func main() {
        DontPanic(
            sdl.Init(sdl.INIT_EVERYTHING))
        defer sdl.Quit()

        DontPanic(
            sdl.GLSetAttribute(sdl.GL_CONTEXT_PROFILE_MASK, sdl.GL_CONTEXT_PROFILE_CORE))
        DontPanic(
            sdl.GLSetAttribute(sdl.GL_CONTEXT_MAJOR_VERSION, GLversion[0]))
        DontPanic(
            sdl.GLSetAttribute(sdl.GL_CONTEXT_MINOR_VERSION, GLversion[1]))

        window, err := sdl.CreateWindow("OpenGL", 200, 200, 1280, 720, sdl.WINDOW_OPENGL)
        DontPanic(err)

        window.GLCreateContext()
        defer window.Destroy()

        GLversionStr := fmt.Sprintf("%d%d0", GLversion[0], GLversion[1])

        gl.Init()
        version := gl.GoStr(gl.GetString(gl.VERSION))
        fmt.Println("OpenGL Version", version)

        vertexShaderSrc :=
            "#version "+ GLversionStr +" core \n"+
            "layout (location = 0) in vec3 aPos;"+
            "void main() {"+
                "gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);"+
            "}\x00"

        vertexShader := gl.CreateShader(gl.VERTEX_SHADER)
        csource, free := gl.Strs(vertexShaderSrc)
        gl.ShaderSource(vertexShader, 1, csource, nil)
        free()
        gl.CompileShader(vertexShader)
        var status int32
        gl.GetShaderiv(vertexShader, gl.COMPILE_STATUS, &status)
        if status == gl.FALSE {
            var logLength int32
            gl.GetShaderiv(vertexShader, gl.INFO_LOG_LENGTH, &logLength)
            log := strings.Repeat("\x00", int(logLength+1))
            gl.GetShaderInfoLog(vertexShader, logLength, nil, gl.Str(log))
            panic("Failed to compile vertex shader:\n" + log)
        }

        fragmentShaderSrc :=
            "#version "+ GLversionStr +" core \n"+
            "out vec4 FragColor;"+
            "void main() {"+
                "FragColor = vec4(1, 0.5, 0.2, 1);"+
            "}\x00"

        fragmentShader := gl.CreateShader(gl.FRAGMENT_SHADER)
        csource, free = gl.Strs(fragmentShaderSrc)
        gl.ShaderSource(fragmentShader, 1, csource, nil)
        free()
        gl.CompileShader(fragmentShader)
        gl.GetShaderiv(fragmentShader, gl.COMPILE_STATUS, &status)
        if status == gl.FALSE {
            var logLength int32
            gl.GetShaderiv(fragmentShader, gl.INFO_LOG_LENGTH, &logLength)
            log := strings.Repeat("\x00", int(logLength+1))
            gl.GetShaderInfoLog(fragmentShader, logLength, nil, gl.Str(log))
            panic("Failed to compile fragment shader:\n" + log)
        }

        shaderPrg := gl.CreateProgram()
        gl.AttachShader(shaderPrg, vertexShader)
        gl.AttachShader(shaderPrg, fragmentShader)
        gl.LinkProgram(shaderPrg)
        gl.GetProgramiv(shaderPrg, gl.LINK_STATUS, &status)
        if status == gl.FALSE {
            panic("Error in Linker, error logging not yet implemented.")
        }
        gl.DeleteShader(vertexShader)
        gl.DeleteShader(fragmentShader)

        vertices := []float32{
            -.5, -.5, 0,
            .5, -.5, 0,
            0,  .5, 0,
        }

        var vertexBuffer uint32
        gl.GenBuffers(1, &vertexBuffer)
        gl.BindBuffer(gl.ARRAY_BUFFER, vertexBuffer)
        var vertexArray uint32
        gl.GenVertexArrays(1, &vertexArray)
        gl.BindVertexArray(vertexArray)

        gl.BufferData(gl.ARRAY_BUFFER, len(vertices)*4, gl.Ptr(vertices), gl.STATIC_DRAW)
        gl.VertexAttribPointer(0, 3, gl.FLOAT, false, 3*4, nil)
        gl.EnableVertexAttribArray(0)
        gl.BindVertexArray(0)

        EventPoll:
        for {
            for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
                switch event.(type) {
                    case *sdl.QuitEvent:
                        break EventPoll
                }
            }
            gl.ClearColor(0, 0, 0, 0)
            gl.Clear(gl.COLOR_BUFFER_BIT)
            gl.BindVertexArray(vertexArray)
            gl.DrawArrays(gl.TRIANGLES, 0, 3)
            window.GLSwap()
        }
    }

您的代碼從不調用glUseProgram ,這意味着您嘗試在沒有當前程序 object 的情況下進行繪制,這在核心配置文件 OpenGL 中無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM