2015-01-13 3 views
2

Мне нужна помощь в том, почему этот кусок кода создает пустое зеленое окно. Я сделал это, объединив примеры из https://github.com/Jragonmiris/mathgl/blob/master/examples/opengl-tutorial/tutorial02/main.go и https://github.com/veandco/go-sdl2/blob/master/examples/opengl3.go. Наверное, я не уверен, что это ошибка в структуре GoLang sdl/gl или проблема с моим пониманием OpenGL. Все это должно рисовать куб.Go Lang 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 и матрицу MV4 mat4, поэтому верьте, что шейдеры работают правильно? Извините за всю путаницу, я думаю, что, возможно, здесь что-то не хватает.

Update: Я побежал версии команд для 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 NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2

Не уверен, что это имеет какое-либо влияние?

Update: Я посмотрел еще несколько примеров, и решил попробовать и добавить некоторые СДЛ атрибуты, но до сих пор не повезло:

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) 

Update:

Я изменил этот пост просто включать более поздние кода, чтобы не пугать людей от TLDR.

+1

Я не 100%, но я думаю, что это может быть рендеринг с вами внутри куба, поэтому вы не видите лица, потому что windi ng ошибочно с этой точки зрения. – LinearZoetrope

+0

Я не уверен, что понимаю. Я использую довольно небольшие значения (1.0, 0 и т. Д.). Кажется, что куб ссылок на sdl2 работает нормально, я могу видеть все в этом примере. Единственное изменение, которое я сделал, было для шейдеров с гораздо более простыми шейдерами из ссылки tutorial2. – efel

+1

Обратите внимание, что шейдеры во втором учебнике, которые вы связали, перемещают куб. Вы визуализируетесь так, чтобы элементы вершин находились в 1.0 или -1.0, но вы находитесь (0,0,0) - вы находитесь внутри куба. В поверхностях OpenGL ориентированы по часовой стрелке. Предположительно, ваши вершины ориентированы по часовой стрелке относительно OUTSIDE куба, поэтому вы их не видите, потому что вы просматриваете треугольники с «спины», где они невидимы. – LinearZoetrope

ответ

1

Я, наконец, выяснил, что моя проблема была в этом коде.

Первое, что я должен был сделать

positionAttrib := program.GetAttribLocation("vertexPosition_modelspace") 

для всех входных переменных, поступающих в вершинном шейдере. Это было сделано после привязки VBO для каждого массива.

Далее

Если вы заметили мой код выше:

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

Я просто заменил его triangle_vertices массив, а не адрес:

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

Делая это, казалось, исправить ,

0

Я бы разместил это как комментарий, но у меня пока нет достаточной репутации.

Решение уже представлено Почти решил мою аналогичную проблему, однако не совсем.

Если Предложенное решение было

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) 

Я также ответил на подобный вопрос с этим, но в более подробном изложении, которое можно найти здесь: OpenGL Vertex Buffer doesn't draw anything in golang

Смежные вопросы