Рендеринг отличается от однопроходного рендеринга
Я начал обновлять мой код, чтобы обеспечить многопроходный рендеринг. Я вполне уверен, что правильно делаю фреймбуферы, но почему-то я не получаю желаемых результатов. Код, который я использую, основан на следующем руководстве: https://learnopengl.com/Advanced-OpenGL/Framebuffers
При рендеринге в буфер по умолчанию я получаю именно то, что ожидаю:
Однако, когда я рендерил это в текстуру кадрового буфера не по умолчанию и помещал ее в четырехугольник, я получал очень удивительный результат:
Итак, мое первоначальное мышление заключается в том, что что-то не так с тем, как я рисую четырехугольник, на котором размещена моя не кадровая по умолчанию текстура кадрового буфера (та, которая охватывает все четыре угла окна). Но при рендеринге только с включенными каркасами я получаю именно то, что ожидаю (и то, что учебник подтверждает, что получу):
Так что я думаю, что с моим кодом есть две возможные проблемы:
Неправильная конфигурация кадрового буфера
Когда кадровый буфер не по умолчанию рисует все в текстуру, он находится в какой-то странной ориентации и масштабе, что приводит к тому, что все отображается полностью неправильно (даже при том, что все идеально при отображении в стандартный буфер кадра). Возможно, какой-то предыдущий буфер не очищен, или в конфигурации есть что-то, что регулирует, как фрейм-буфер рендерится в текстуру.
Четырехъядерная текстура оборачивается
Текстура слишком мала, и, когда она обернута на квад, который намного больше, она повторяет вывод и, по-видимому, как-то вращается... Обратите внимание, как объекты растягиваются косо, когда они пересекают диагональную линию к верхнему правому треугольнику квада. Это должно быть связано с какой-то проблемой...
Код (в порядке выполнения):
конфигурация кадрового буфера
gl.GenFramebuffers(1, &o.fbo)
gl.BindFramebuffer(gl.FRAMEBUFFER, o.fbo)
gl.GenTextures(1, &o.cbo)
gl.BindTexture(gl.TEXTURE_2D, o.cbo)
gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGB, int32(o.screenWidth), int32(o.screenHeight), 0, gl.RGB, gl.UNSIGNED_BYTE, nil)
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)
gl.FramebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, o.cbo, 0)
gl.GenRenderbuffers(1, &o.rbo)
gl.BindRenderbuffer(gl.RENDERBUFFER, o.rbo)
gl.RenderbufferStorage(gl.RENDERBUFFER, gl.DEPTH24_STENCIL8, int32(o.screenWidth), int32(o.screenHeight))
gl.FramebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, o.rbo)
if gl.CheckFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE {
log.Fatal("Framebuffer incomplete")
}
gl.BindFramebuffer(gl.FRAMEBUFFER, 0)
...
первый проход
gl.BindFramebuffer(gl.FRAMEBUFFER, o.fbo)
gl.Enable(gl.DEPTH_TEST)
gl.ClearColor(clearColor.R, clearColor.G, clearColor.B, clearColor.A)
gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
gl.UseProgram(o.shaderProgram)
...
нарисовать каждый объект
gl.DrawElements(gl.TRIANGLES, 6, gl.UNSIGNED_BYTE, gl.PtrOffset(0))
gl.UniformMatrix4fv(model_uni, 1, false, &model[0])
gl.BindVertexArray(0)
...
ничья второго прохода
gl.BindFramebuffer(gl.FRAMEBUFFER, 0)
gl.Disable(gl.DEPTH_TEST)
gl.ClearColor(1, 1, 1, 1)
gl.Clear(gl.COLOR_BUFFER_BIT)
gl.UseProgram(o.screenShaderProgram)
gl.BindVertexArray(o.quadVAO)
gl.BindTexture(gl.TEXTURE_2D, o.cbo)
gl.DrawElements(gl.TRIANGLES, 6, gl.UNSIGNED_BYTE, gl.PtrOffset(0))
o.window.SwapBuffers()
glfw32.PollEvents()
четырехъядерный
vertices := []float32{
1.0, 1.0, 1.0, 1.0, // 0 top right
1.0, -1.0, 1.0, 0.0, // 1 bot right
-1.0, -1.0, 0.0, 0.0, // 2 bot left
-1.0, 1.0, 0.0, 1.0, // 3 top left
}
indicies := []uint8{
0, 1, 3,
1, 2, 3,
}
var vertexArrayID uint32
gl.GenVertexArrays(1, &vertexArrayID)
gl.BindVertexArray(vertexArrayID)
// Vertex buffer
var vertexBuffer uint32
gl.GenBuffers(1, &vertexBuffer)
gl.BindBuffer(gl.ARRAY_BUFFER, vertexBuffer)
gl.BufferData(gl.ARRAY_BUFFER, len(vertices)*4, gl.Ptr(vertices), gl.STATIC_DRAW)
// Element buffer
var elementBuffer uint32
gl.GenBuffers(1, &elementBuffer)
gl.BindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementBuffer)
gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, len(indicies)*4, gl.Ptr(indicies), gl.STATIC_DRAW)
// Linking vertex attributes
gl.VertexAttribPointer(0, 2, gl.FLOAT, false, 4*4, gl.PtrOffset(0))
gl.EnableVertexAttribArray(0)
// Linking texture attributes
gl.VertexAttribPointer(1, 2, gl.FLOAT, false, 3*4, gl.PtrOffset(2*4))
gl.EnableVertexAttribArray(1)
o.quadVAO = vertexArrayID
// Unbind Vertex array object
gl.BindVertexArray(0)
1 ответ
Шаг указателя координат текстуры неправильный. Оно должно быть 4*4 вместо 3*4, так как начало двух последовательных вершин равно 4 отстоят друг от друга.