Skip to content

Commit 5e6cf11

Browse files
committed
BT2020,shader该怎么修改?
shader新增对比度,饱和度,亮度调节;
1 parent 05a5a9e commit 5e6cf11

File tree

4 files changed

+58
-5
lines changed

4 files changed

+58
-5
lines changed

README.md

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,30 @@
1313
2. 在WidgetRender中,尽可能使用QImage::Format_RGB32和QImage::Format_ARGB32_Premultiplied图像格式。如下原因:
1414
1. Avoid most rendering directly to most of these formats using QPainter. Rendering is best optimized to the Format_RGB32 and Format_ARGB32_Premultiplied formats, and secondarily for rendering to the Format_RGB16, Format_RGBX8888, Format_RGBA8888_Premultiplied, Format_RGBX64 and Format_RGBA64_Premultiplied formats.
1515

16+
### OpenGL 怎么渲染BT.2020色彩空间的图像?
17+
18+
现在调整了对比度,饱和度,亮度;效果并不是很好。
19+
20+
```cpp
21+
contrast = 1.6;
22+
saturation = 1.0;
23+
brightness = 0;
24+
```
25+
如果不调整,就跟ffplay输出图像效果一致,整体颜色偏暗。Netflix的视频,视频开头的N,显示的颜色偏暗黄色。
26+
27+
### OpenGL 渲染图像,怎么实现画质增强的效果?
28+
1629
### Ffmpeg(5.0)在解码字幕与4.4.3不太一样
1730

18-
### 解码字幕(ffmpeg-n5.0):
31+
#### 解码字幕(ffmpeg-n5.0):
1932

2033
```
2134
0,,en,,0000,0000,0000,,Peek-a-boo!
2235
```
2336

2437
你必须使用 ``ass_process_chunk`` 并设置 pts 和持续时间, 如在 libavfilter/vf_subtitles.c 中一样。
2538

26-
ASS 标准格式应为(ffmpeg-n4.4.3) :
39+
#### ASS 标准格式应为(ffmpeg-n4.4.3) :
2740

2841
```
2942
Dialogue: 0,0:01:06.77,0:01:08.00,en,,0000,0000,0000,,Peek-a-boo!\r\n

ffmpeg/colorspace.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ static constexpr std::array<float, 9> kBT709Matrix
2525
static constexpr QVector3D kBT2020ffset = {-0.0627451017, -0.501960814, -0.501960814};
2626

2727
static constexpr std::array<float, 9> kBT2020Matrix
28-
= {1.1644, 1.1644, 1.1644, 0.000, -0.187326f, 2.141772f, 1.678674f, -0.650424f, 0.000};
28+
= {1.1678, 1.1678, 1.1678, 0.0000, -0.1879, 2.1481, 1.6836, -0.6523, 0.0000};
2929

3030
} // namespace Ffmpeg::ColorSpace
3131

ffmpeg/videorender/openglrender.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,9 @@ void OpenglRender::initSubTexture()
183183

184184
void OpenglRender::setColorSpace()
185185
{
186+
GLfloat contrast = 1.0;
187+
GLfloat saturation = 0;
188+
GLfloat brightness = 0;
186189
auto *avFrame = d_ptr->framePtr->avFrame();
187190
switch (avFrame->colorspace) {
188191
case AVCOL_SPC_BT470BG:
@@ -196,6 +199,9 @@ void OpenglRender::setColorSpace()
196199
d_ptr->programPtr->setUniformValue("offset", ColorSpace::kBT2020ffset);
197200
d_ptr->programPtr->setUniformValue("colorConversion",
198201
QMatrix3x3(ColorSpace::kBT2020Matrix.data()));
202+
contrast = 1.6;
203+
saturation = 1.0;
204+
brightness = 0;
199205
break;
200206
//case AVCOL_SPC_BT709:
201207
default:
@@ -204,6 +210,9 @@ void OpenglRender::setColorSpace()
204210
QMatrix3x3(ColorSpace::kBT709Matrix.data()));
205211
break;
206212
}
213+
d_ptr->programPtr->setUniformValue("contrast", contrast);
214+
d_ptr->programPtr->setUniformValue("saturation", saturation);
215+
d_ptr->programPtr->setUniformValue("brightness", brightness);
207216
}
208217

209218
auto OpenglRender::fitToScreen(const QSize &size) -> QMatrix4x4

ffmpeg/videorender/shader/video_nv12.frag

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,41 @@
11
#version 330 core
22

3-
in vec2 TexCord; // 纹理坐标
4-
out vec4 FragColor; // 输出颜色
3+
in vec2 TexCord; // 纹理坐标
4+
out vec4 FragColor; // 输出颜色
55

66
uniform sampler2D tex_y;
77
uniform sampler2D tex_u;
88

99
uniform vec3 offset;
1010
uniform mat3 colorConversion;
1111

12+
uniform float contrast;
13+
uniform float saturation;
14+
uniform float brightness;
15+
16+
vec3 adjustContrast(vec3 rgb, float contrast) // 对比度调整函数
17+
{
18+
vec3 temp = rgb - vec3(0.5);
19+
temp = temp * contrast;
20+
temp = temp + vec3(0.5);
21+
temp = clamp(temp, vec3(0.0), vec3(1.0));
22+
return temp;
23+
}
24+
25+
vec3 adjustSaturation(vec3 rgb, float saturation) // 饱和度调整函数
26+
{
27+
const vec3 luminosityFactor = vec3(0.2126, 0.7152, 0.0722);
28+
vec3 grayscale = vec3(dot(rgb, luminosityFactor));
29+
return mix(grayscale, rgb, 1.0 + saturation);
30+
}
31+
32+
vec3 adjustBrightness(vec3 rgb, float brightness) // 亮度调整函数
33+
{
34+
vec3 temp = rgb + vec3(brightness);
35+
temp = clamp(temp, vec3(0.0), vec3(1.0));
36+
return temp;
37+
}
38+
1239
void main()
1340
{
1441
vec3 yuv;
@@ -20,5 +47,9 @@ void main()
2047
yuv += offset;
2148
rgb = yuv * colorConversion;
2249

50+
rgb = adjustContrast(rgb, contrast);
51+
rgb = adjustSaturation(rgb, saturation);
52+
rgb = adjustBrightness(rgb, brightness);
53+
2354
FragColor = vec4(rgb, 1.0);
2455
}

0 commit comments

Comments
 (0)