{
  "text": "<p>Fill in the blanks:</p>",
  "questions": [
    "A compute shader is dispatched using *glDispatchCompute*(groupsX, groupsY, groupsZ) rather than a draw call.|The shader stage constant for a compute shader is *GL_COMPUTE_SHADER*.|After dispatch, call *glMemoryBarrier*() before reading the SSBO in a subsequent draw call.|Each thread identifies its global index via *gl_GlobalInvocationID*.x.|For 100,000 particles with local_size_x=256, the group count is *ceil*(100000 / 256) = *391*.|After glLinkProgram(), the compiled shader object is freed with *glDeleteShader*(id).|A compute shader still uses *glUseProgram*() to bind, just like a standard shader program.|The inherited *Bind*() method calls glUseProgram(m_RendererID) with no changes needed.|Compute shaders require OpenGL *4.3* or later — earlier versions do not support GL_COMPUTE_SHADER.|The protected default constructor *Shader*() initialises m_RendererID to 0 without compiling vertex or fragment stages."
  ],
  "overallFeedback": [
    {
      "from": 0,
      "to": 49,
      "feedback": "Review the syntax and try again."
    },
    {
      "from": 50,
      "to": 99,
      "feedback": "Close — check the details."
    },
    {
      "from": 100,
      "to": 100,
      "feedback": "All correct — well done!"
    }
  ],
  "showSolutions": "end",
  "behaviour": {
    "enableRetry": true,
    "enableSolutionsButton": true,
    "enableCheckButton": true,
    "autoCheck": false,
    "caseSensitive": false,
    "showSolutionsRequiresInput": true,
    "separateLines": false,
    "confirmCheckDialog": false,
    "confirmRetryDialog": false,
    "acceptSpellingErrors": false
  },
  "UI": {
    "checkAnswerButton": "Check",
    "submitAnswerButton": "Submit",
    "showSolutionButton": "Show solution",
    "tryAgainButton": "Retry",
    "notFilledOut": "Please fill in all blanks to view solution",
    "answerIsCorrect": "':ans' is correct",
    "answerIsWrong": "':ans' is wrong",
    "answeredCorrectly": "Answered correctly",
    "answeredIncorrectly": "Answered incorrectly",
    "solutionLabel": "Correct answer:",
    "inputLabel": "Blank input @num of @total",
    "inputHasTipLabel": "Tip available",
    "tipLabel": "Tip"
  }
}