PlayerGLWidget.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include "PlayerGLWidget.h"
  2. PlayerGLWidget::PlayerGLWidget(QWidget *parent) : QOpenGLWidget(parent)
  3. {
  4. }
  5. PlayerGLWidget::~PlayerGLWidget()
  6. {
  7. }
  8. /* 刷新一帧 */
  9. void PlayerGLWidget::updateFrame(Image_YUV420& image)
  10. {
  11. // yData = image.yData;
  12. // uData = image.uData;
  13. // vData = image.vData;
  14. update();
  15. }
  16. /* 刷新一帧QImage */
  17. void PlayerGLWidget::updateFrame(Image_QImage& image)
  18. {
  19. m_image = image;
  20. imageData_ = m_image.image.bits();
  21. imageSize_.setWidth(m_image.width);
  22. imageSize_.setHeight(m_image.height);
  23. update();
  24. }
  25. void PlayerGLWidget::initializeGL()
  26. {
  27. initializeOpenGLFunctions();
  28. texture_ = new QOpenGLTexture(QOpenGLTexture::Target2D);
  29. texture_->create();
  30. textureId_ = texture_->textureId();
  31. glBindTexture(GL_TEXTURE_2D, textureId_);
  32. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  33. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  34. }
  35. void PlayerGLWidget::resizeGL(int w, int h)
  36. {
  37. Ortho2DSize_.setWidth(w);
  38. Ortho2DSize_.setHeight(h);
  39. glViewport(0,0, w, h);
  40. glMatrixMode(GL_PROJECTION);
  41. glLoadIdentity();
  42. glOrtho(0, Ortho2DSize_.width(), Ortho2DSize_.height(), 0, -1, 1);
  43. glMatrixMode(GL_MODELVIEW);
  44. }
  45. void PlayerGLWidget::paintGL()
  46. {
  47. static bool initTextureFlag = false;
  48. // initializeOpenGLFunctions(); // 初始化 OpenGL 函数
  49. glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  50. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  51. if(imageData_ == nullptr){
  52. return;
  53. }
  54. //QByteArray ba((const char*)imageData_,64);
  55. //qDebug() <<imageData_ << ba;
  56. glBindTexture(GL_TEXTURE_2D, textureId_);
  57. if(!initTextureFlag){
  58. // 首次显示纹理
  59. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageSize_.width(), imageSize_.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData_);
  60. initTextureFlag = true;
  61. }
  62. else{
  63. // 动态修改纹理数据
  64. glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, imageSize_.width(), imageSize_.height(), GL_RGBA, GL_UNSIGNED_BYTE, imageData_);
  65. //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageSize_.width(), imageSize_.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData_);
  66. }
  67. glEnable(GL_TEXTURE_2D);
  68. glBegin(GL_POLYGON);
  69. //顶点坐标和纹理坐标必须一一对应
  70. glTexCoord2d(0.0f, 0.0f);
  71. glVertex2d(0, 0);
  72. glTexCoord2d(0.0f, 1.0f);
  73. glVertex2d(0, Ortho2DSize_.height());
  74. glTexCoord2d(1.0f, 1.0f);
  75. glVertex2d(Ortho2DSize_.width(), Ortho2DSize_.height());
  76. glTexCoord2d(1.0f, 0.0f);
  77. glVertex2d(Ortho2DSize_.width(), 0);
  78. glEnd();
  79. glDisable(GL_TEXTURE_2D);
  80. }