PlayerGLWidget.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #include "PlayerGLWidget.h"
  2. #include "spdlog/spdlog.h"
  3. #include <qopenglext.h>
  4. #include <QVariant>
  5. PlayerGLWidget::PlayerGLWidget(QWidget *parent) : QOpenGLWidget(parent)
  6. {
  7. }
  8. PlayerGLWidget::~PlayerGLWidget()
  9. {
  10. if(m_shaderRGBA != nullptr) {
  11. delete m_shaderRGBA;
  12. m_shaderRGBA = nullptr;
  13. }
  14. }
  15. /* 显示RGBA图片 */
  16. void PlayerGLWidget::showOneRGBAImage(const QImage& image)
  17. {
  18. if(image.format() == QImage::Format_RGBA8888)
  19. {
  20. m_shaderRGBA->refreshFrameRGBA(image);
  21. } else
  22. {
  23. QImage imageRGBA = image.convertToFormat(QImage::Format_RGBA8888);
  24. m_shaderRGBA->refreshFrameRGBA(imageRGBA);
  25. }
  26. m_shaderCurr = m_shaderRGBA; // 设置当前着色器为显示RGBA图片的着色器
  27. update(); // 更新界面,触发paintGL函数
  28. }
  29. /* 显示一张YUV420的图片 */
  30. void PlayerGLWidget::showOneYUV420Image(const Image_YUV420& yuvData)
  31. {
  32. if(!yuvData.isValid()) {
  33. SPDLOG_WARN("YUV420数据无效");
  34. return;
  35. }
  36. m_shaderYUV420->refreshFrameYUV420(yuvData);
  37. m_shaderCurr = m_shaderYUV420; // 设置当前着色器为显示YUV420图片的着色器
  38. update(); // 更新界面,触发paintGL函数
  39. }
  40. void PlayerGLWidget::testShowYUV420Image(const QImage& image)
  41. {
  42. m_shaderYUV420->refreshFrameRGBA(image);
  43. m_shaderCurr = m_shaderYUV420; // 设置当前着色器为显示YUV420图片的着色器
  44. update(); // 更新界面,触发paintGL函数
  45. }
  46. /* 初始化RGBA的Shader */
  47. void PlayerGLWidget::initShaderRGBA()
  48. {
  49. if(m_shaderRGBA != nullptr) {
  50. delete m_shaderRGBA; // 删除旧的着色器对象
  51. m_shaderRGBA = nullptr;
  52. }
  53. m_shaderRGBA = new ShaderRect();
  54. m_shaderRGBA->initShape(); // 初始化形状
  55. /* 初始化RGBA着色器 */
  56. QString vertexShaderFile = ":/shaderCode/vertexShaderRGBA.glsl";
  57. QString fragmentShaderFile = ":/shaderCode/fragmentShaderRGBA.glsl";
  58. if (!m_shaderRGBA->loadShaderCode(vertexShaderFile, fragmentShaderFile))
  59. {
  60. SPDLOG_ERROR("加载着色器代码失败");
  61. return;
  62. }
  63. /* 编译着色器 */
  64. m_shaderRGBA->compileShader();
  65. /* 初始化纹理 */
  66. m_shaderRGBA->initTextures();
  67. }
  68. /* 初始化YUV420的Shader */
  69. void PlayerGLWidget::initShaderYUV420()
  70. {
  71. if(m_shaderYUV420 != nullptr) {
  72. delete m_shaderYUV420; // 删除旧的着色器对象
  73. m_shaderYUV420 = nullptr;
  74. }
  75. m_shaderYUV420 = new ShaderYUV420();
  76. m_shaderYUV420->initShape(); // 初始化形状
  77. /* 初始化RGBA着色器 */
  78. QString vertexShaderFile = ":/shaderCode/vertexShaderYUV420.glsl";
  79. QString fragmentShaderFile = ":/shaderCode/fragmentShaderYUV420.glsl";
  80. if (!m_shaderYUV420->loadShaderCode(vertexShaderFile, fragmentShaderFile))
  81. {
  82. SPDLOG_ERROR("加载着色器代码失败");
  83. return;
  84. }
  85. /* 编译着色器 */
  86. m_shaderYUV420->compileShader();
  87. /* 初始化纹理 */
  88. m_shaderYUV420->initTextures();
  89. }
  90. void PlayerGLWidget::initializeGL()
  91. {
  92. SPDLOG_DEBUG("编译着色器...");
  93. /* 初始化OpenGL函数,OpenGL的函数是在运行时才确定函数指针的 */
  94. initializeOpenGLFunctions();
  95. /* 初始化显示RGBA图片的着色器 */
  96. initShaderRGBA();
  97. /* 初始化显示YUV420图片的着色器 */
  98. initShaderYUV420();
  99. SPDLOG_DEBUG("着色器编译完成");
  100. }
  101. void PlayerGLWidget::resizeGL(int w, int h)
  102. {
  103. /* 设置视口 */
  104. glViewport(0, 0, w, h);
  105. /* 设置投影矩阵 */
  106. // m_shaderObj->setProjectionMatrix(w, h);
  107. // SPDLOG_INFO("resizeGL: width = {}, height = {}", w, h);
  108. }
  109. void PlayerGLWidget::paintGL()
  110. {
  111. /* glClearColor函数是一个状态设置函数,而glClear函数则是一个状态使用的函数,
  112. * 它使用了当前的状态来获取应该清除为的颜色。 */
  113. glClearColor(0.1f, 0.3f, 0.3f, 1.0f);
  114. glClear(GL_COLOR_BUFFER_BIT);
  115. if(m_shaderCurr == nullptr)
  116. {
  117. // SPDLOG_WARN("当前着色器对象为空");
  118. return;
  119. }
  120. m_shaderCurr->useShader(); // 使用着色器
  121. m_shaderCurr->drawShape(); // 绘制图形
  122. }