亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號