glReadPixels 不会将数据写入数组

我坚持glReadPixels:似乎没有数据写入输出数组。


从手册(https://www.opengl.org/sdk/docs/man/docbook4/xhtml/glReadPixels.xml)中写道,如果生成错误,则不会对数据内容进行任何更改。,但显然没有错误返回glGetError()。


我真的不明白出了什么问题......这是代码 - 在 golang 中 - 对屏幕中的随机点进行采样。它总是打印[0 0 0],尽管没有像素应该是黑色的(甚至不是背景)。


package main


import (

    "fmt"

    "github.com/go-gl/gl/v4.1-core/gl"

    "github.com/veandco/go-sdl2/sdl"

    "math/rand"

    "os"

    "runtime"

)


func main() {

    // Random crashes, this seems to fix

    runtime.LockOSThread()


    var wWidth, wHeight int = 500, 500


    // Initialize SDL

    if err := sdl.Init(sdl.INIT_EVERYTHING); err != nil {

        panic(err)

    }

    defer sdl.Quit()


    // Initialize OpenGL

    if err := gl.Init(); err != nil {

        panic(err)

    }


    // Create the OpenGL-capable window

    win, err := sdl.CreateWindow(

        "glReadPixels Test",

        sdl.WINDOWPOS_CENTERED,

        sdl.WINDOWPOS_CENTERED,

        wWidth, wHeight,

        sdl.WINDOW_OPENGL)


    if err != nil {

        panic(err)

    }

    defer win.Destroy()


    // Setup OpenGL context

    var ctx sdl.GLContext

    ctx, err = sdl.GL_CreateContext(win)

    if err != nil {

        panic(err)

    }

    defer sdl.GL_DeleteContext(ctx)


    // Settings

    initGL(wWidth, wHeight)


    for {

        for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {

            switch event.(type) {

            case *sdl.QuitEvent:

                os.Exit(0)

            }

        }


        // Clear and draw

        gl.Clear(gl.COLOR_BUFFER_BIT)

        gl.DrawArrays(gl.TRIANGLE_STRIP, 0, 4)


        rx, ry := rand.Intn(wWidth), rand.Intn(wHeight)

        sdl.GL_SwapWindow(win)


        // Check for errors...

        if gl.GetError() != gl.NO_ERROR {

            fmt.Println("GL ERROR Somewhere!")

        }


        sdl.Delay(uint32(300))

    }

}


慕丝7291255
浏览 132回答 1
1回答

白猪掌柜的

问题很可能gl.ReadPixels(int32(rx), int32(ry), 1, 1, gl.RGB, gl.UNSIGNED_BYTE, gl.Ptr(&data))具体来说gl.Ptr(&data)该功能的文档是:// Ptr takes a slice or pointer (to a singular scalar value or the first// element of an array or slice) and returns its GL-compatible address.您正在将 POINTER 传递给切片。如果您查看实现,这是......有问题。func Ptr(data interface{}) unsafe.Pointer {    if data == nil {        return unsafe.Pointer(nil)    }    var addr unsafe.Pointer    v := reflect.ValueOf(data)    switch v.Type().Kind() {    case reflect.Ptr:        e := v.Elem()        switch e.Kind() {        case            reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,            reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,            reflect.Float32, reflect.Float64:            addr = unsafe.Pointer(e.UnsafeAddr())        }    case reflect.Uintptr:        addr = unsafe.Pointer(v.Pointer())    case reflect.Slice:addr = unsafe.Pointer(v.Index(0).UnsafeAddr())    default:        panic(fmt.Sprintf("Unsupported type %s; must be a pointer, slice, or array", v.Type()))    }    return addr}如您所见,如果您传入一个指向除基本 uint/float/int 以外的任何内容的指针,它将静默失败并返回 null,unsafe.Pointer如果它的类型不正确。所以你要么想传入gl.Ptr(&data[0])要么gl.Ptr(data)。这不是段错误,老实说有点令人惊讶。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go