Я не могу заставить DrawElements правильно работать в go-gl

мой код разделен на два файла. вот main.go:

      package main

import (
    "fmt"
    "runtime"

    "github.com/go-gl/gl/v4.1-core/gl"
    "github.com/go-gl/glfw/v3.2/glfw"
)

const (
    width  = 500
    height = 500
)

func main() {
    runtime.LockOSThread()

    window := InitWindow(width, height, "hello triangle")
    defer glfw.Terminate()

    triangle1 := []float32{
        -.5, .5,
        .5, .5,
        -.5, -.5,
    }
    indices := []uint32{
        0, 1, 2,
    }
    shader := loadShader("shaders/vs.glsl", "shaders/fs.glsl")

    vao, vbo, ebo := makeVaoFromObj(triangle1, indices)

    fmt.Println(vbo)
    fmt.Println(ebo)
    for !window.ShouldClose() {
        //gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)

        //draw(vao, window, shader)
        gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
        gl.BindVertexArray(vao)
        gl.UseProgram(shader.program)

        gl.DrawElements(gl.TRIANGLES, 3, gl.UNSIGNED_INT, nil)

        glfw.PollEvents()
        window.SwapBuffers()
    }
}

и вот мой другой файл go:

      package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "strings"

    "github.com/go-gl/gl/v4.1-core/gl"
    "github.com/go-gl/glfw/v3.2/glfw"
)

func InitWindow(width int, height int, title string) *glfw.Window {
    // init glfw
    if err := glfw.Init(); err != nil {
        panic(err)
    }
    glfw.WindowHint(glfw.Resizable, glfw.True)
    glfw.WindowHint(glfw.ContextVersionMajor, 4)
    glfw.WindowHint(glfw.ContextVersionMinor, 1)
    glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile)
    glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True)

    window, err := glfw.CreateWindow(width, height, title, nil, nil)
    if err != nil {
        panic(err)
    }
    window.MakeContextCurrent()

    // init opengl
    if err := gl.Init(); err != nil {
        panic(err)
    }
    version := gl.GoStr(gl.GetString(gl.VERSION))
    log.Println("OpenGL version", version)

    return window
}

func makeVao(points []float32, indices []uint32) uint32 {
    var vbo uint32
    gl.GenBuffers(1, &vbo)
    gl.BindBuffer(gl.ARRAY_BUFFER, vbo)
    gl.BufferData(gl.ARRAY_BUFFER, 4*len(points), gl.Ptr(points), gl.STATIC_DRAW)

    var vao uint32
    gl.GenVertexArrays(1, &vao)
    gl.BindVertexArray(vao)
    gl.EnableVertexAttribArray(0)
    gl.VertexAttribPointer(0, 2, gl.FLOAT, false, 0, nil)

    var ibo uint32 // element buffer object
    gl.GenBuffers(1, &ibo)
    gl.BindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo)
    gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, len(indices)*4, gl.Ptr(indices), gl.STATIC_DRAW)

    return vao
}

func makeVaoFromObj(points []float32, indices []uint32) (uint32, uint32, uint32) {
    // Create VAO
    var vao uint32
    gl.GenVertexArrays(1, &vao)
    gl.BindVertexArray(vao)

    // Store coordinates in VBO
    var vbo uint32
    gl.GenBuffers(1, &vbo)
    gl.BindBuffer(gl.ARRAY_BUFFER, vbo)
    gl.BufferData(gl.ARRAY_BUFFER, 4*len(points), gl.Ptr(points), gl.STATIC_DRAW)

    // Vector
    gl.VertexAttribPointer(0, 3, gl.FLOAT, false, int32(8), gl.PtrOffset(0))
    gl.EnableVertexAttribArray(0)

    // Store indices of the coordinates in EBO
    var ebo uint32
    gl.GenBuffers(1, &ebo)
    gl.BindBuffer(gl.ELEMENT_ARRAY_BUFFER, ebo)
    gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, 4*len(indices), gl.Ptr(indices), gl.STATIC_DRAW)

    return vao, vbo, ebo
}
func compileShader(source string, shaderType uint32) (uint32, error) {
    shader := gl.CreateShader(shaderType)

    csources, free := gl.Strs(source)
    gl.ShaderSource(shader, 1, csources, nil)
    free()
    gl.CompileShader(shader)

    var status int32
    gl.GetShaderiv(shader, gl.COMPILE_STATUS, &status)
    if status == gl.FALSE {
        var logLength int32
        gl.GetShaderiv(shader, gl.INFO_LOG_LENGTH, &logLength)

        log := strings.Repeat("\x00", int(logLength+1))
        gl.GetShaderInfoLog(shader, logLength, nil, gl.Str(log))

        return 0, fmt.Errorf("failed to compile %v: %v", source, log)
    }

    return shader, nil
}

func loadFile(path string) string {
    file, err := ioutil.ReadFile(path)
    if err != nil {
        fmt.Printf("Could not read the file due to this %s error \n", err)
    }
    // convert the file binary into a string using string
    fileContent := string(file)
    // print file content
    return fileContent
}

func loadShader(vsPath string, fsPath string) shader {
    program := gl.CreateProgram()

    vsData := loadFile(vsPath) + "\x00"
    fsData := loadFile(fsPath) + "\x00"

    vertexShader, err := compileShader(vsData, gl.VERTEX_SHADER)
    if err != nil {
        panic(err)
    }

    fragmentShader, err := compileShader(fsData, gl.FRAGMENT_SHADER)
    if err != nil {
        panic(err)
    }

    gl.AttachShader(program, vertexShader)
    gl.AttachShader(program, fragmentShader)
    gl.LinkProgram(program)
    return shader{
        vertexShader:   vertexShader,
        fragmentShader: fragmentShader,
        program:        program,
    }
}

func setUniform1f(name string, value float32, shader shader) int32 {
    location := gl.GetUniformLocation(shader.program, gl.Str(name+"\x00"))
    gl.Uniform1f(location, value)
    return location
}


На данный момент makeVao работает с gl.DrawTriangles, но я не могу заставить индексы работать даже после просмотра нескольких руководств по opengl (хотя я не смог найти ничего конкретно по go-gl)

При использовании DrawElements рисуется только половина треугольника, как если бы вершины были{-.5,.5, .5,.5, 0,0}. Я новичок в go-gl, но в прошлом я использовал OpenTK с C# и думал, что смогу попробовать go-gl, но, очевидно, нет.

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

0 ответов

Другие вопросы по тегам