WidgetGL1.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include "WidgetGL1.h"
  2. #include <gl/gl.h>
  3. #include <qopenglext.h>
  4. #include "spdlog/spdlog.h"
  5. WidgetGL1::WidgetGL1(QWidget *parent)
  6. {
  7. }
  8. WidgetGL1::~WidgetGL1()
  9. {
  10. }
  11. void WidgetGL1::initializeGL()
  12. {
  13. /* 初始化OpenGL函数 */
  14. initializeOpenGLFunctions();
  15. /* 顶点输入 */
  16. float vertices[] = {
  17. -0.5f, -0.5f, 0.0f,
  18. 0.5f, -0.5f, 0.0f,
  19. 0.0f, 0.5f, 0.0f
  20. };
  21. /* 顶点缓冲对象 */
  22. GLuint VBO;
  23. glGenBuffers(1, &VBO);
  24. /* 将VBO绑定到缓冲对象上(其实是用于激活这个VBO对象,可以对这个对象进行操作了)
  25. 说明:OpenGL的对象操作都要依赖OpenGL提供的函数,有很多对象类型,这里将VBO绑定在 GL_ARRAY_BUFFER 上,就像放在了对应的操作台上,之后就可以对这个对象进行
  26. 操作,后续的一切对 GL_ARRAY_BUFFER 的操作就是对VBO的操作 */
  27. glBindBuffer(GL_ARRAY_BUFFER, VBO);
  28. /* 将数据拷贝到VBO中 */
  29. glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  30. /* 顶点着色器 */
  31. const char* vertexShaderSource = R"(
  32. #version 330 core
  33. layout (location = 0) in vec3 aPos;
  34. void main()
  35. {
  36. gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
  37. }
  38. )";
  39. /* 创建顶点着色器对象 */
  40. GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  41. /* 加载顶点着色器源码 */
  42. glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr);
  43. /* 编译着色器 */
  44. glCompileShader(vertexShader);
  45. printOpenGLCompileError(vertexShader);
  46. }
  47. void WidgetGL1::resizeGL(int w, int h)
  48. {
  49. }
  50. void WidgetGL1::paintGL()
  51. {
  52. }
  53. /* 打印编译错误 */
  54. void WidgetGL1::printOpenGLCompileError(GLuint errorCode)
  55. {
  56. int sucess;
  57. char infoLog[512];
  58. glGetShaderiv(errorCode, GL_COMPILE_STATUS, &sucess);
  59. if (!sucess)
  60. {
  61. glGetShaderInfoLog(errorCode, 512, nullptr, infoLog);
  62. SPDLOG_ERROR("OpenGL编译错误: {}", infoLog);
  63. }
  64. }