OpenGL и SDL2 не могут открыть окно - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь научиться использовать OpenGL и SDL2, но когда я запускаю простую программу, опубликованную ниже, окно открывается и мгновенно закрывается со следующим сообщением: exit status 3221225477.

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.

РЕДАКТИРОВАТЬ : Поэтому я добавил gl.Init() перед настройкой атрибутов OpenGL. Я продолжаю в том же духе, но программа продолжает работать. Окно невидимо (его не видно на панели задач), и единственный способ выйти - нажать CTRL + C в терминале. Я пропускаю какой-то другой вызов функции?

1 Ответ

0 голосов
/ 05 января 2019

Подобный сбой можно увидеть в ggez / ggez выпуске 141 (не относится к Go, фактически в Rust с OpenGL)

Дело в том, что сначала проверьте свой драйвер. Та же проблема упоминается:

Я, наверное, нахожу причину.
Я обновил драйвер интегрированной видеокарты, и все в порядке.
Я не знаю почему, но теперь все может работать правильно.

Информация о моем устройстве:

  • Семейство графических процессоров Intel (R) HD -> Я обновил этот драйвер
  • AMD Radeon HD 8850M
...