OpenGL和SDL2无法打开窗口。

3

我正在尝试学习如何使用OpenGL和SDL2,但是当我运行下面发布的简单程序时,窗口会打开并立即关闭。

main.go

package main

import (
    "fmt"

    "github.com/go-gl/gl/v4.1-core/gl"
    "github.com/veandco/go-sdl2/sdl"
)

var (
    window  *sdl.Window
    context sdl.GLContext
)

func main() {
    // Initialize sdl and create context
    initialize()

    // Initialize OpenGL pointers
    gl.Init()

    // Setup opengl attributes
    setOpenGLAttributes()

    // This makes our buffer swap syncronized with the monitor's vertical refresh
    sdl.GLSetSwapInterval(1)

    // Run and clean
    run()
    clean()
}

func initialize() {
    sdl.Init(sdl.INIT_EVERYTHING)

    window, err := sdl.CreateWindow("Test", sdl.WINDOWPOS_CENTERED, sdl.WINDOWPOS_CENTERED, 1280, 720, sdl.WINDOW_OPENGL)
    if err != nil {
        fmt.Println(err)
        return
    }

    context, err = window.GLCreateContext()
    if err != nil {
        fmt.Println(err)
        return
    }
}

func setOpenGLAttributes() {
    // SDL_GL_CONTEXT_CORE gives us only the newer version, deprecated functions are disabled
    sdl.GLSetAttribute(sdl.GL_CONTEXT_PROFILE_MASK, sdl.GL_CONTEXT_PROFILE_CORE)

    // 3.2 is part of the modern versions of OpenGL, but most video cards whould be able to run it
    sdl.GLSetAttribute(sdl.GL_CONTEXT_MAJOR_VERSION, 3)
    sdl.GLSetAttribute(sdl.GL_CONTEXT_MINOR_VERSION, 2)

    // Turn on double buffering with a 24bit Z buffer.
    sdl.GLSetAttribute(sdl.GL_DOUBLEBUFFER, 1)
}

func run() {
    for {
        for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
            switch event.(type) {
            case *sdl.QuitEvent:
                return
            }
        }

        gl.ClearColor(1, 8, 20, 1.0)
        gl.Clear(gl.COLOR_BUFFER_BIT)
        window.GLSwap()
    }
}

func clean() {
    // Delete our OpengL context
    sdl.GLDeleteContext(context)

    // Destroy our window
    window.Destroy()

    // Shutdown SDL 2
    sdl.Quit()
}

我做错了什么?我正在按照这个教程操作:http://headerphile.com/sdl2/opengl-part-1-sdl-opengl-awesome/,但是将其转换为Go后看起来好像没有漏掉任何东西。 编辑:所以我在设置OpenGL属性之前添加了gl.Init()。我仍然得到相同的行为,但程序继续运行。窗口是不可见的(无法在任务栏中看到),唯一退出程序的方法是在终端中按下CTRL+C。我是否漏掉了其他函数调用?
1个回答

0

您可以在ggez/ggez issue 141中看到类似的崩溃(实际上是Rust与OpenGL相关,而不是Go)

重点是:首先检查您的驱动程序。同样提到的问题:

我可能找到了原因。
我更新了我的集成显卡驱动程序,现在一切正常。
我不知道为什么,但现在一切都可以正常工作。

我的设备信息:

  • Intel(R) HD Graphics Family -> 我更新了这个驱动程序
  • AMD Radeon HD 8850M

我更新了我的驱动程序(NVIDIA GTX 970),但问题仍然存在。 - o.o

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接