123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- #include "PlayerGLWidget.h"
- PlayerGLWidget::PlayerGLWidget(QWidget *parent) : QOpenGLWidget(parent)
- {
- }
- PlayerGLWidget::~PlayerGLWidget()
- {
- }
- /* 刷新一帧 */
- void PlayerGLWidget::updateFrame(Image_YUV420& image)
- {
- // yData = image.yData;
- // uData = image.uData;
- // vData = image.vData;
- update();
- }
- /* 刷新一帧QImage */
- void PlayerGLWidget::updateFrame(Image_QImage& image)
- {
- m_image = image;
- imageData_ = m_image.image.bits();
- imageSize_.setWidth(m_image.width);
- imageSize_.setHeight(m_image.height);
- update();
- }
- void PlayerGLWidget::initializeGL()
- {
- initializeOpenGLFunctions();
- texture_ = new QOpenGLTexture(QOpenGLTexture::Target2D);
- texture_->create();
- textureId_ = texture_->textureId();
- glBindTexture(GL_TEXTURE_2D, textureId_);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- }
- void PlayerGLWidget::resizeGL(int w, int h)
- {
- Ortho2DSize_.setWidth(w);
- Ortho2DSize_.setHeight(h);
- glViewport(0,0, w, h);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(0, Ortho2DSize_.width(), Ortho2DSize_.height(), 0, -1, 1);
- glMatrixMode(GL_MODELVIEW);
- }
- void PlayerGLWidget::paintGL()
- {
- static bool initTextureFlag = false;
- // initializeOpenGLFunctions(); // 初始化 OpenGL 函数
- glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- if(imageData_ == nullptr){
- return;
- }
- //QByteArray ba((const char*)imageData_,64);
- //qDebug() <<imageData_ << ba;
- glBindTexture(GL_TEXTURE_2D, textureId_);
- if(!initTextureFlag){
- // 首次显示纹理
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageSize_.width(), imageSize_.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData_);
- initTextureFlag = true;
- }
- else{
- // 动态修改纹理数据
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, imageSize_.width(), imageSize_.height(), GL_RGBA, GL_UNSIGNED_BYTE, imageData_);
- //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageSize_.width(), imageSize_.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData_);
- }
- glEnable(GL_TEXTURE_2D);
- glBegin(GL_POLYGON);
- //顶点坐标和纹理坐标必须一一对应
- glTexCoord2d(0.0f, 0.0f);
- glVertex2d(0, 0);
- glTexCoord2d(0.0f, 1.0f);
- glVertex2d(0, Ortho2DSize_.height());
- glTexCoord2d(1.0f, 1.0f);
- glVertex2d(Ortho2DSize_.width(), Ortho2DSize_.height());
- glTexCoord2d(1.0f, 0.0f);
- glVertex2d(Ortho2DSize_.width(), 0);
- glEnd();
- glDisable(GL_TEXTURE_2D);
-
- }
|