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
Go Lang OpenGL简单形状-空白屏幕_Opengl_Go_Sdl 2_Opengl 3_Glew - Fatal编程技术网

Go Lang OpenGL简单形状-空白屏幕

Go Lang OpenGL简单形状-空白屏幕,opengl,go,sdl-2,opengl-3,glew,Opengl,Go,Sdl 2,Opengl 3,Glew,我需要一些帮助来解释为什么这段代码会生成一个空白的绿色窗口。我是通过结合和的例子来做到这一点的。我想我不确定这是GoLang sdl/gl框架的错误还是我对OpenGL理解的问题。所有这些都应该画一个立方体 我的代码是: 包干管 import ( "fmt" // gl "github.com/chsc/gogl/gl33" "github.com/veandco/go-sdl2/sdl" // "math" "github.com/Jragonmiris

我需要一些帮助来解释为什么这段代码会生成一个空白的绿色窗口。我是通过结合和的例子来做到这一点的。我想我不确定这是GoLang sdl/gl框架的错误还是我对OpenGL理解的问题。所有这些都应该画一个立方体

我的代码是:

包干管

import (
    "fmt"
    // gl "github.com/chsc/gogl/gl33"
    "github.com/veandco/go-sdl2/sdl"
    // "math"
    "github.com/Jragonmiris/mathgl"
    "github.com/go-gl/gl"
    "runtime"
    "time"
)

// var program gl.Program = 0
// var buffer gl.Buffer = 0

func MakeProgram(vert, frag string) gl.Program {

    vertShader, fragShader := gl.CreateShader(gl.VERTEX_SHADER), gl.CreateShader(gl.FRAGMENT_SHADER)
    vertShader.Source(vert)
    fragShader.Source(frag)

    vertShader.Compile()
    fragShader.Compile()

    prog := gl.CreateProgram()

    prog.AttachShader(vertShader)
    prog.AttachShader(fragShader)
    prog.Link()
    prog.Validate()
    fmt.Println(prog.GetInfoLog())

    return prog
}

func main() {
    var window *sdl.Window
    var context sdl.GLContext
    var event sdl.Event
    var running bool
    var err error

    runtime.LockOSThread()

    if 0 != sdl.Init(sdl.INIT_EVERYTHING) {
        panic(sdl.GetError())
    }
    window, err = sdl.CreateWindow(winTitle, sdl.WINDOWPOS_UNDEFINED,
        sdl.WINDOWPOS_UNDEFINED,
        winWidth, winHeight, sdl.WINDOW_OPENGL)
    if err != nil {
        panic(err)
    }
    if window == nil {
        panic(sdl.GetError())
    }
    context = sdl.GL_CreateContext(window)
    if context == nil {
        panic(sdl.GetError())
    }

    if gl.Init() != 0 {
        panic("gl error")
    }

    gl.ClearColor(1.0, 1.0, 1.0, .5)
    gl.Viewport(0, 0, winWidth, winHeight)

    program := MakeProgram(vertexShaderSource, fragmentShaderSource)
    defer program.Delete()

    matrixID := program.GetUniformLocation("MVP")
    Projection := mathgl.Perspective(45.0, 4.0/3.0, 0.1, 100.0)
    View := mathgl.LookAt(4.0, 3.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
    Model := mathgl.Ident4f()
    MVP := Projection.Mul4(View).Mul4(Model) 

    gl.Enable(gl.DEPTH_TEST)
    gl.DepthFunc(gl.LESS)
    gl.Enable(gl.BLEND)
    gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)

    vertexArray := gl.GenVertexArray()
    defer vertexArray.Delete()
    vertexArray.Bind()

    buffer := gl.GenBuffer()
    defer buffer.Delete()
    buffer.Bind(gl.ARRAY_BUFFER)
    gl.BufferData(gl.ARRAY_BUFFER, len(triangle_vertices)*4, &triangle_vertices, gl.STATIC_DRAW)

    running = true
    for running {
        for event = sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
            switch t := event.(type) {
            case *sdl.QuitEvent:
                running = false
            case *sdl.MouseMotionEvent:

                fmt.Printf(string(t.Timestamp))
            }
        }

        gl.Clear(gl.COLOR_BUFFER_BIT) // | gl.DEPTH_BUFFER_BIT)
        program.Use()
        matrixID.UniformMatrix4fv(false, MVP)
        attribLoc := gl.AttribLocation(0)
        attribLoc.EnableArray()
        buffer.Bind(gl.ARRAY_BUFFER)
        attribLoc.AttribPointer(3, gl.FLOAT, false, 0, nil)

        gl.DrawArrays(gl.TRIANGLES, 0, 3)

        attribLoc.DisableArray()

        time.Sleep(50 * time.Millisecond)

        sdl.GL_SwapWindow(window)
    }

    sdl.GL_DeleteContext(context)
    window.Destroy()
    sdl.Quit()
}



const (
    winTitle           = "OpenGL Shader"
    winWidth           = 640
    winHeight          = 480
    vertexShaderSource = `
#version 330 core

// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 vertexPosition_modelspace;
// Values that stay constant for the whole mesh.
uniform mat4 MVP;
void main(){

    gl_Position = MVP * vec4 (vertexPosition_modelspace,1.0);

}
`
    fragmentShaderSource = `
#version 330 core

// Ouput data
out vec3 color;

void main()
{

    // Output color = red 
    color = vec3(1,0,0);

}
`
)

var triangle_vertices = []float32{
    -.5, -.5, -.5,
    .5, -.5, -.5,
    0.0, 0.5, -.5,
}
所以我在屏幕上画一个简单的形状仍然有困难。我做了一些改变,例如简化了我的形状(三角形)。我创建了坐标,使它们更靠近-z轴,这样我就可以看到它们,但这并没有起作用。然后我设置MVP矩阵(将相机向后移动一些)以确保。我的着色器很简单,因为我只传递vec3顶点位置和mat4 MVP矩阵,所以相信着色器工作正常吗?很抱歉这么混乱,我想我可能遗漏了什么

更新: 我还运行了opengl的版本命令:

fmt.Println(gl.GetString(gl.VERSION))
fmt.Println(gl.GetString(gl.VENDOR))
fmt.Println(gl.GetString(gl.RENDERER))
其输出为:

4.5.0 NVIDIA 347.09 英伟达公司 GeForce GTX 650 Ti/PCIe/SSE2

不确定这是否有任何影响

更新: 我看了更多的例子,并决定尝试添加一些sdl属性,但仍然没有成功:

sdl.GL_SetAttribute(sdl.GL_DOUBLEBUFFER, 1)
sdl.GL_SetAttribute(sdl.GL_RED_SIZE, 8)
sdl.GL_SetAttribute(sdl.GL_GREEN_SIZE, 8)
sdl.GL_SetAttribute(sdl.GL_BLUE_SIZE, 8)
sdl.GL_SetAttribute(sdl.GL_ALPHA_SIZE, 8)
更新:


我修改了这篇文章,只加入了一些最新的代码,以避免人们被TLDR吓跑。

我终于明白了这段代码中的问题所在

我要做的第一件事就是

positionAttrib := program.GetAttribLocation("vertexPosition_modelspace")
对于进入顶点着色器的所有输入变量。这是在为每个数组绑定VBO后完成的

其次,

如果您注意到我上面的代码:

gl.BufferData(gl.ARRAY_BUFFER, len(triangle_vertices)*4, &triangle_vertices, gl.STATIC_DRAW)
我只是将其替换为三角形顶点数组,而不是地址:

gl.BufferData(gl.ARRAY_BUFFER, len(triangle_vertices)*4, triangle_vertices, gl.STATIC_DRAW)

这样做似乎可以解决问题。

我会将此作为评论发布,但我还没有足够的声誉

这个解决方案已经几乎解决了我类似的问题,但是还不完全解决

提供的解决方案在哪里

gl.BufferData(gl.ARRAY_BUFFER, len(triangle_vertices)*4, triangle_vertices, gl.STATIC_DRAW)
解决我的问题的实际代码是

gl.BufferData(gl.ARRAY_BUFFER, len(triangle_vertices)*4, gl.Ptr(triangle_vertices), gl.STATIC_DRAW)
我也回答了一个类似的问题,但更详细的问题可以在这里找到:

我不是100%,但我认为这可能是在立方体内部绘制的,因此你看不到面,因为从这个角度看,缠绕是错误的。我不确定我是否理解。我使用的是非常小的值(1.0、0等)。sdl2链接示例多维数据集似乎工作正常,我可以看到该示例中的所有内容。我所做的唯一更改是使用tutorial2链接中更简单的着色器修改着色器请注意,您链接的第二个教程中的着色器会移动立方体。渲染时,顶点元素处于1.0或-1.0,但处于(0,0,0)-处于立方体内部。在OpenGL中,面是基于顺时针方向的。假设你的顶点相对于立方体的外部是顺时针方向的,所以你看不到它们,因为你是从“后面”看三角形的,在那里它们是不可见的。请注意,这个例子基本上是mathgl教程4(这些是我的,尽管它们是从C教程改编的),但是使用SDL而不是glfw。这只是一个愚蠢的建议,但是着色器编译的日志输出是什么?您确定您的源文本在定义为现在的输入代码时包含输入代码吗?如果没有,那么您的
/
rems将一直保留到源代码结束。。。