PlayerGLWidget.cpp 2.2 KB

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