Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl glReadPixels不向数组写入数据_Opengl_Go_Sdl 2 - Fatal编程技术网

Opengl glReadPixels不向数组写入数据

Opengl glReadPixels不向数组写入数据,opengl,go,sdl-2,Opengl,Go,Sdl 2,我被glReadPixels卡住了:输出数组中似乎没有写入任何数据 从手册()中可以看出,如果生成错误,则不会对数据内容进行任何更改。glGetError()显然不会返回任何错误 我真的不明白怎么了。。。这是在golang中对屏幕上的随机点进行采样的代码。它总是打印[0],尽管没有像素应该是黑色的(即使是背景) 主程序包 进口( “fmt” “github.com/go gl/gl/v4.1-core/gl” “github.com/veandco/go-sdl2/sdl” “数学/兰德” “操

我被
glReadPixels
卡住了:输出数组中似乎没有写入任何数据

从手册()中可以看出,如果生成错误,则不会对数据内容进行任何更改。
glGetError()
显然不会返回任何错误

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

主程序包
进口(
“fmt”
“github.com/go gl/gl/v4.1-core/gl”
“github.com/veandco/go-sdl2/sdl”
“数学/兰德”
“操作系统”
“运行时”
)
func main(){
//随机崩溃,这似乎可以修复
runtime.LockOSThread()
变量wWidth,wHeight int=500500
//初始化SDL
如果err:=sdl.Init(sdl.Init_EVERYTHING);err!=nil{
恐慌(错误)
}
延迟sdl.Quit()
//初始化OpenGL
如果错误:=gl.Init();错误!=nil{
恐慌(错误)
}
//创建支持OpenGL的窗口
win,err:=sdl.CreateWindow(
“glReadPixels测试”,
sdl.WINDOWPOS_居中,
sdl.WINDOWPOS_居中,
第十二,嗯,
sdl.WINDOW(OPENGL)
如果错误!=零{
恐慌(错误)
}
推迟获胜,摧毁
//设置OpenGL上下文
var ctx sdl.GLContext
ctx,err=sdl.GL\u CreateContext(win)
如果错误!=零{
恐慌(错误)
}
延迟sdl.GL\U删除上下文(ctx)
//背景
初始GL(wWidth,wHeight)
为了{
对于事件:=sdl.PollEvent();事件!=nil;事件=sdl.PollEvent(){
开关事件。(类型){
案例*sdl.QuitEvent:
操作系统退出(0)
}
}
//清清楚楚
总账清除(总账颜色\u缓冲\u位)
总图绘图阵列(总图三角带,0,4)
rx,ry:=rand.Intn(wWidth),rand.Intn(wHeight)
gl.ReadBuffer(gl.FRONT)//也不使用gl.BACK
数据:=生成([]字节,3)
//数据[0],数据[1],数据[2]=123213132//测试它是否被覆盖
gl.ReadPixels(int32(rx)、int32(ry)、1、1、gl.RGB、gl.UNSIGNED_字节、gl.Ptr(&data))
fmt.Println(“读取时间”、接收时间、ry时间、数据)
//橱窗展示
sdl.GL_SwapWindow(胜利)
//检查错误。。。
如果gl.GetError()!=gl.NO\u错误{
fmt.Println(“总帐某处出错!”)
}
sdl.延迟(uint32(300))
}
}
func initGL(winW,winH int){
gl.ClearColor(0.2,0.2,0.3,1.0)
总图视口(0、0、int32(winW)、int32(winH))
//着色器源
vertShaderSrc:=gl.Str(`
#版本130
在vec3垂直位;
vec2-vertUV;
出2弗拉古夫;
void main(){
gl_位置=vec4(垂直位置,1.0f);
fragUV=vertUV;
}
`+“\x00”)
fragShaderSrc:=gl.Str(`#版本130
在vec2 fragUV;
外显vec3外显色;
void main(){
如果(fragUV.x<0.5^^ fragUV.y<0.5)
outColor=vec3(1.0,0.0,0.0);
其他的
outColor=vec3(0.0,0.0,1.0);
}
`+“\x00”)
//着色器
var vShader,fShader uint32
vShader=gl.CreateShader(gl.VERTEX_着色器)
fShader=gl.CreateShader(gl.FRAGMENT\u着色器)
gl.ShaderSource(vShader,1和vertShaderSrc,nil)
总账着色器源(fShader,1和fragShaderSrc,nil)
总帐编译头(vShader)
总帐编译管理员(fShader)
//节目
var progr uint32=gl.CreateProgram()
总承包商附件(程序、vShader)
总承包商附件(程序、固件)
gl.BindAttribLocation(程序,0,gl.Str(“vertPos\x00”))
gl.BindAttribLocation(程序,1,gl.Str(“vertUV\x00”))
总账链接程序(progr)
总账使用程序(progr)
常数N float32=-0.5
常数P float32=0.5
//设置“画布”:一个简单的四边形
画布数据:=[]浮动32{
N、 N,0,0.0,0.0,
P、 N,0,1.0,0.0,
N、 P,0,0.0,1.0,
P、 P,0,1.0,1.0,
}
变量vboID uint32
总账.GenBuffers(1和vboID)
gl.BindBuffer(gl.ARRAY\u BUFFER,vboID)
总账缓冲数据(总账数组\ U缓冲区、len(canvasData)*4、总账Ptr(canvasData)、总账静态\ U绘图)
vaoID uint32型变量
总图GenVertexArrays(1和vaoID)
总帐BindVertexArray(vaoID)
gl.EnableVertexAttributeArray(0)
gl.EnableVertexAttributeArray(1)
总账VertexAttributePointer(0,3,总账浮点,false,5*4,总账PtrOffset(0))
总账VertexAttributePointer(1,2,总账浮点,false,5*4,总账PtrOffset(3*4))
}
问题很可能出现

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.
您正在将指针传递给一个切片。这是。。。如果您查看实现,就会发现问题

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)
。老实说,令人惊讶的是,这不是断层

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
}