Атрибуты вершин OpenGL, позиция работает, а texcoord - нет?

Вершинный шейдер:

#version 130

in vec2 position;
in vec2 texcoord;

out vec3 Color;
out vec2 Texcoord;

void main() {
    Texcoord = texcoord;
    gl_Position = vec4(position, 0, 1);
}

Фрагмент шейдера:

#version 130

in vec2 Texcoord;
uniform sampler2D texImage;

void main()
{
  gl_FragColor = texture2D(texImage, Texcoord);
}

Где я инициализирую свое изображение:

func initImage() {
    gl.UseProgram(texProgram)
    var vao uint32
    gl.GenVertexArrays(1, &vao)
    gl.BindVertexArray(vao)
    imgQuadData := []float32{
        -.5, .5, 0, 0, // Top Left
        .5, .5, 1, 0, // Top Right
        .5, -.5, 1, 1, // Bottom Right
        -.5, -.5, 0, 1, // Bottom Left
    }

    gl.GenBuffers(1, &imgQuadBuffer)
    gl.BindBuffer(gl.ARRAY_BUFFER, imgQuadBuffer)
    gl.BufferData(gl.ARRAY_BUFFER, len(imgQuadData)*4, gl.Ptr(imgQuadData), gl.STATIC_DRAW)

    posAttrib = gl.GetAttribLocation(texProgram, gl.Str("position\x00"))
    gl.EnableVertexAttribArray(uint32(posAttrib))
    gl.VertexAttribPointer(uint32(posAttrib), 2, gl.FLOAT, false, 4*4, gl.Ptr(nil))

    texAttrib = gl.GetAttribLocation(texProgram, gl.Str("texcoord\x00"))
    gl.EnableVertexAttribArray(uint32(texAttrib))
    ptr := 2 * 4
    gl.VertexAttribPointer(uint32(texAttrib), 2, gl.FLOAT, false, 4*4, gl.Ptr(&ptr))

    pixels := []float32{
        1, 0, 0, 0, 1, 0, // Red / Green
        0, 0, 1, 1, 1, 1, // Blue / White
    }
    gl.ActiveTexture(gl.TEXTURE0)
    gl.GenTextures(1, &bcTexture)
    gl.BindTexture(gl.TEXTURE_2D, bcTexture)
    gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGB, 2, 2, 0, gl.RGB, gl.FLOAT, gl.Ptr(&pixels[0]))
    gl.Uniform1i(gl.GetUniformLocation(texProgram, gl.Str("texImage\x00")), 0)

    gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
    gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
    gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)
    gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)
}

Где я рисую на экране:

gl.ClearColor(1, 1, 0, 1)
gl.Clear(gl.COLOR_BUFFER_BIT)
gl.UseProgram(texProgram)
gl.BindBuffer(gl.ARRAY_BUFFER, imgQuadBuffer)
gl.DrawArrays(gl.QUADS, 0, 4)

На ноутбуке, который я использую 1.30, поддерживается последняя версия языка GLSL, поэтому я не могу перейти на более новую версию.

imgQuadData содержит положение X/Y, где нужно нарисовать угол квадрата, а также то, какими должны быть значения S/T для координат текстуры в этом углу. Я следовал этому уроку, чтобы получить то, что у меня есть. Хотя я работаю в go, библиотека go-gl делает довольно простым преобразование вызовов C++ GL в вызовы GL.

красный квадрат на желтом фоне

Ведет себя так, как будто Texcoord во фрагменте шейдер всегда vec2(0, 0), Если я изменю эту строку в фрагментном шейдере, чтобы использовать vec2(1, 1) вместо Texcoord тогда квадрат правильно меняет цвет. Кажется, проблема в том, что imgQuadData неправильно анализируется вершинным шейдером, чтобы получить значения S и T как отличные от 0, и я не понимаю, почему.

Как мои атрибуты позиции могут быть успешно прочитаны, но мои атрибуты texcoord всегда равны 0?

1 ответ

Оказывается, при указании последнего параметра в gl.VertexAttribPointer ты должен использовать gl.PtrOffset вместо gl.Ptr, Я думаю, что GL видел с gl.Ptr был большой адрес, когда он должен был быть 8 (пропустите первые 2 числа с плавающей точкой, которые имеют размер 4).

правильное размытие цвета

Другие вопросы по тегам