PlayerGLWidget.cpp 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. void PlayerGLWidget::initializeGL()
  30. {
  31. SPDLOG_DEBUG("编译着色器...");
  32. /* 初始化OpenGL函数,OpenGL的函数是在运行时才确定函数指针的 */
  33. initializeOpenGLFunctions();
  34. /* 初始化显示RGBA图片的着色器 */
  35. m_shaderRGBA = new ShaderRect();
  36. m_shaderRGBA->initShape(); // 初始化形状
  37. /* 初始化RGBA着色器 */
  38. QString vertexShaderFile = ":/shaderCode/vertexShaderRGBA.glsl";
  39. QString fragmentShaderFile = ":/shaderCode/fragmentShaderRGBA.glsl";
  40. if (!m_shaderRGBA->loadShaderCode(vertexShaderFile, fragmentShaderFile))
  41. {
  42. SPDLOG_ERROR("加载着色器代码失败");
  43. return;
  44. }
  45. /* 编译着色器 */
  46. m_shaderRGBA->compileShader();
  47. /* 创建一个纹理对象 */
  48. m_textureRGBAUnit = m_shaderRGBA->createTexture("textureRGBA");
  49. if(m_textureRGBAUnit < 0)
  50. {
  51. SPDLOG_ERROR("RGBA着色器创建纹理失败!");
  52. }
  53. SPDLOG_DEBUG("着色器编译完成");
  54. }
  55. void PlayerGLWidget::resizeGL(int w, int h)
  56. {
  57. /* 设置视口 */
  58. glViewport(0, 0, w, h);
  59. /* 设置投影矩阵 */
  60. // m_shaderObj->setProjectionMatrix(w, h);
  61. // SPDLOG_INFO("resizeGL: width = {}, height = {}", w, h);
  62. }
  63. void PlayerGLWidget::paintGL()
  64. {
  65. /* glClearColor函数是一个状态设置函数,而glClear函数则是一个状态使用的函数,
  66. * 它使用了当前的状态来获取应该清除为的颜色。 */
  67. glClearColor(0.1f, 0.3f, 0.3f, 1.0f);
  68. glClear(GL_COLOR_BUFFER_BIT);
  69. if(m_shaderCurr == nullptr)
  70. {
  71. // SPDLOG_WARN("当前着色器对象为空");
  72. return;
  73. }
  74. m_shaderCurr->useShader(); // 使用着色器
  75. m_shaderCurr->drawShape(); // 绘制图形
  76. }