Почему эта программа OpenGL не рисует треугольник?

Я пытаюсь изучить современный OpenGL и хочу нарисовать такой треугольник: http://www.opengl-tutorial.  org/wp-content/uploads/2011/04/red_triangle.png

Я следую этому руководству: www.opengl-tutorial .org/beginners-tutorials/tutorial-2-the-first-triangle/, но все, что я получаю, это темно-синий фон (чистый цвет). Что может быть не так с этим кодом?

Я пишу это на Go и пытался запустить на Ubuntu и OS X. Примечание: я использую библиотеку glfw 3 вместо glfw 2.7, которая используется в руководстве.

Я думаю, что соответствующие части:

func setup() {
    gl.ClearColor(0.0, 0.0, 0.4, 0.0)

    makeProgram(vertexShaderSource,fragmentShaderSource)

    vertexBufferData := []float32{
        -1,-1,0,
         1,-1,0,
         0, 1,0,
    }

    vertexBuffer = gl.GenBuffer()
    vertexBuffer.Bind(gl.ARRAY_BUFFER)
    gl.BufferData(gl.ARRAY_BUFFER, len(vertexBufferData)*4, vertexBufferData, gl.STATIC_DRAW)
}

func draw() {
    gl.Clear(gl.COLOR_BUFFER_BIT)

    program.Use()
    // first attribute buffer: vertices
    var vertexAttrib = program.GetAttribLocation("vertexPosition_modelspace")
    vertexAttrib.EnableArray()
    vertexBuffer.Bind(gl.ARRAY_BUFFER)
    var f float32 = 0.0

    vertexAttrib.AttribPointer(
        3,     // size
        gl.FLOAT, // type
        false, // normalized
        0,     // stride
        &f) // array buffer offset

    // draw the triangle
    gl.DrawArrays(gl.TRIANGLES, 0, 3)

    vertexAttrib.DisableArray()

}

Ссылка на полный код: https://gist.github.com/mbertschler/8672365

Я уже пытался отлаживать это с помощью OpenGL Profiler на OSX, но пока ошибок не показывает.


person mbert    schedule 28.01.2014    source источник
comment
Не размещайте ссылки на код на внешних сайтах. Если вы считаете, что в противном случае ваш код был бы слишком большим, сократите его.   -  person Cubic    schedule 29.01.2014
comment
Последний аргумент vertexAttrib.AttribPointer() отличается от учебника, которому вы следуете. В учебнике он передает 0 как указатель void *. Здесь вы передали адрес переменной float32 (которая не будет равна нулю). Может ли это быть проблема?   -  person James Henstridge    schedule 29.01.2014
comment
&f) // array buffer offset не имеет никакого смысла. Это должно быть смещение в байтах — приведенное к (void *) — в текущий связанный GL_ARRAY_BUFFER. Попробуйте заменить &f на (0).   -  person Brett Hale    schedule 29.01.2014
comment
@BrettHale, вставив (0), компилирует, но выводит: panic: type must be a pointer, a slice, uintptr or nil. Насколько я понимаю (0) - это просто целочисленный литерал. Что именно означает (void*)0, я не могу найти четкого описания. Это указатель на значение 0?   -  person mbert    schedule 29.01.2014


Ответы (1)


Ошибка была в:

var f float32 = 0.0

vertexAttrib.AttribPointer(
    3,     // size
    gl.FLOAT, // type
    false, // normalized
    0,     // stride
    &f) // array buffer offset

Хотя это, похоже, сработало для ОП этого вопроса: ничего не рисуй на голанге это не с моей программой. В принятом ответе была правильная версия этого вызова. Он работает с nil в качестве смещения буфера массива.

Рабочий код:

(По крайней мере, для github.com/go-gl/gl привязок)

vertexAttrib.AttribPointer(
    3,     // size
    gl.FLOAT, // type
    false, // normalized
    0,     // stride
    nil) // array buffer offset
person mbert    schedule 29.01.2014