Итак, я недавно переписал часть рендеринга своего хобби графического движка OpenGL, и я не могу понять, почему я получаю исключение нарушения прав доступа, генерируемое в glDrawElements.
Из того, что я исследовалуже, как правило, это происходит из-за неправильно настроенного VAO, но из того, что я вижу, все выглядит хорошо.
Ниже приведен порядок вызовов OpenGL, которые я выполняю до получения ошибки.К сожалению, я не могу записать значения каждого параметра, но если кто-то может заметить ошибку в заказе, пожалуйста, дайте мне знать.
Обратите внимание, что я использую OpenGL 4.1 на видеокарте Nvidia 1080 и драйверы работаютна сегодняшний день.
glCreateShaderProgramv(GetShaderType(_desc.ShaderType), 1, &ptr)
glGetProgramiv(_id, GL_INFO_LOG_LENGTH, &logLength)
glGetProgramiv(_id, GL_LINK_STATUS, &linkStatus)
glCreateShaderProgramv(GetShaderType(_desc.ShaderType), 1, &ptr)
glGetProgramiv(_id, GL_INFO_LOG_LENGTH, &logLength)
glGetProgramiv(_id, GL_LINK_STATUS, &linkStatus)
glGenBuffers(1, &_id)
glBindBuffer(target, _id)
glBufferData(target, _desc.ByteCount, 0, GetBufferUsage(_desc.BufferUsage))
glBindBuffer(target, _id)
glMapBufferRange(target, byteOffset, byteCount, access)
glDisable(GL_POLYGON_OFFSET_FILL)
glDisable(GL_POLYGON_OFFSET_POINT)
glDisable(GL_POLYGON_OFFSET_LINE)
glDisable(GL_CULL_FACE)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
glDisable(GL_SCISSOR_TEST)
glScissor(0, 0, _desc.RenderWidth, _desc.RenderHeight)
glDisable(GL_MULTISAMPLE)
glDisable(GL_DEPTH_CLAMP)
glDisable(GL_LINE_SMOOTH)
glDisable(GL_STENCIL_TEST)
glStencilOpSeparate(GL_FRONT, GetStencilOp(stencilOperationDesc.FailOp), GetStencilOp(stencilOperationDesc.ZFailOp), GetStencilOp(stencilOperationDesc.PassOp))
glStencilOpSeparate(GL_FRONT, GetStencilOp(stencilOperationDesc.FailOp, true), GetStencilOp(stencilOperationDesc.ZFailOp, true), GetStencilOp(stencilOperationDesc.PassOp, true))
glStencilFuncSeparate(GL_FRONT, GetCompareFunc(comparisonFunc), _stencilRefValue, readMask)
glStencilFuncSeparate(GL_BACK, GetCompareFunc(comparisonFunc), _stencilRefValue, readMask)
glStencilMask(writeMask)
glEnable(GL_DEPTH_TEST)
glDepthMask(GL_FALSE)
glDepthFunc(GetCompareFunc(depthFunc))
glGenBuffers(1, &_id)
glBindBuffer(target, _id)
glBufferData(target, _desc.ByteCount, 0, GetBufferUsage(_desc.BufferUsage))
glBindBuffer(target, _id)
glMapBufferRange(target, byteOffset, byteCount, access)
glGenBuffers(1, &_id)
glBindBuffer(target, _id)
glBufferData(target, _desc.ByteCount, 0, GetBufferUsage(_desc.BufferUsage))
glBindBuffer(target, _id)
glMapBufferRange(target, byteOffset, byteCount, access)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glIndexBuffer->GetId())
glGenProgramPipelines(1, &_id)
glUseProgramStages(_id, GL_VERTEX_SHADER_BIT, desc.VertexShaderId)
glUseProgramStages(_id, GL_FRAGMENT_SHADER_BIT, desc.PixelShaderId)
glUseProgramStages(_id, GL_GEOMETRY_SHADER_BIT, desc.GeometryShaderId)
glUseProgramStages(_id, GL_TESS_CONTROL_SHADER_BIT, desc.HullShaderId)
glUseProgramStages(_id, GL_TESS_EVALUATION_SHADER_BIT, desc.DomainShaderId)
glBindProgramPipeline(shaderPipeline->GetId())
glGenVertexArrays(1, &vao)
glBindVertexArray(vao)
glBindBuffer(GL_ARRAY_BUFFER, boundBuffers[inputSlot]->GetId())
glVertexAttribPointer(inputSlot, compSize, compType, GL_FALSE, stride, reinterpret_cast<GLvoid*>(offset))
glEnableVertexAttribArray(inputSlot)
glBindVertexArray(0)
glBindVertexArray(vao->GetId())