Просмотр исходного кода

V0.8.2
1、修改了纹理缩放方式,现在更平滑了

apple 1 день назад
Родитель
Сommit
c8f09073e4

+ 1 - 1
demo/OpenGLWidgetLibrary/GLShader/ShaderBase.cpp

@@ -174,7 +174,7 @@ int ShaderBase::createTexture(const QString uniformName, int textureUnit)
     QOpenGLTexture* texture = new QOpenGLTexture(QOpenGLTexture::Target2D);
     /* 设置纹理参数 */
     texture->setWrapMode(QOpenGLTexture::Repeat); // S轴环绕方式
-    texture->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear); // 纹理缩小过滤方式
+    texture->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear); // 纹理缩小过滤方式:三线性过滤
     texture->setMagnificationFilter(QOpenGLTexture::Linear); // 纹理放大过滤方式
     
 

+ 2 - 0
demo/OpenGLWidgetLibrary/GLShader/ShaderRect.cpp

@@ -144,6 +144,8 @@ bool ShaderRect::refreshFrameRGBA(const QImage& image, int textureUnit)
     }
     m_lastSize = image.size();
     texture->setData(QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, image.bits()); // 设置纹理数据
+    texture->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear); // 纹理缩小过滤方式
+    texture->setMagnificationFilter(QOpenGLTexture::Linear); // 纹理放大过滤方式
 
     texture->generateMipMaps(); // 生成多级渐远纹理
 

+ 7 - 0
demo/OpenGLWidgetLibrary/GLShader/ShaderYUV420.cpp

@@ -3,6 +3,7 @@
 
 #include <QOpenGLWidget>
 #include <QOpenGLFunctions_3_3_Core>
+#include <qopengltexture.h>
 
 #include "spdlog/spdlog.h"
 
@@ -219,14 +220,20 @@ bool ShaderYUV420::refreshFrameYUV420(const Image_YUV420P& yuvData)
     /* 设置Y分量纹理 */
     textureY->setData(QOpenGLTexture::Red, QOpenGLTexture::UInt8, yuvData.yData.constData());
     textureY->generateMipMaps(); // 生成多级渐远纹理
+    textureY->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
+    textureY->setMagnificationFilter(QOpenGLTexture::Linear); // 纹理放大过滤方式
 
     /* 设置U分量纹理 */
     textureU->setData(QOpenGLTexture::Red, QOpenGLTexture::UInt8, yuvData.uData.constData());
     textureU->generateMipMaps(); // 生成多级渐远纹理
+    textureU->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
+    textureU->setMagnificationFilter(QOpenGLTexture::Linear); // 纹理放大过滤方式
 
     /* 设置V分量纹理 */
     textureV->setData(QOpenGLTexture::Red, QOpenGLTexture::UInt8, yuvData.vData.constData());
     textureV->generateMipMaps(); // 生成多级渐远纹理
+    textureV->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
+    textureV->setMagnificationFilter(QOpenGLTexture::Linear); // 纹理放大过滤方式
 
     printGLerror("ShaderYUV420::refreshFrameYUV420");
 

+ 4 - 1
demo/OpenGLWidgetLibrary/shaderCode/fragmentShaderYUV420.glsl

@@ -11,11 +11,14 @@ uniform sampler2D textureV;
 
 void main()
 {
+    //在着色器里取出某个位置上的像素值,rgba四分量,单通道只有r有效
+    //y的范围是[0, 1],u和v的范围是[-0.5, 0.5]
     float y = texture(textureY, TexCoord).r;
+    //uv只有y分量的四分之一,映射到屏幕上的范围是[-0.5-0.5],所以需要减去0.5
     float u = texture(textureU, TexCoord).r - 0.5;
     float v = texture(textureV, TexCoord).r - 0.5;
     float r = y + 1.402 * v;
-    float g = y - 0.344 * u - 0.714 * v;
+    float g = y - 0.344136 * u - 0.714136 * v;
     float b = y + 1.772 * u;
     FragColor = vec4(r, g, b, 1.0);
 }