为了账号安全,请及时绑定邮箱和手机立即绑定

glReadPixels 不会将数据写入数组

glReadPixels 不会将数据写入数组

Go
慕丝7291255 2021-11-22 16:43:49
我坚持glReadPixels:似乎没有数据写入输出数组。从手册(https://www.opengl.org/sdk/docs/man/docbook4/xhtml/glReadPixels.xml)中写道,如果生成错误,则不会对数据内容进行任何更改。,但显然没有错误返回glGetError()。我真的不明白出了什么问题......这是代码 - 在 golang 中 - 对屏幕中的随机点进行采样。它总是打印[0 0 0],尽管没有像素应该是黑色的(甚至不是背景)。package mainimport (    "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))    }}
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞


问题很可能


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)。这不是段错误,老实说有点令人惊讶。


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信