@@ -29,15 +29,28 @@ static CGEConstString s_fshWaveform = "#version 310 es\n" CGE_SHADER_STRING(
2929 // TODO: 直接使用 255 来描述最亮是没有问题的。 如果要实现颜色亮度叠加. 可以考虑使用 imageAtomicAdd.
3030 });
3131
32+ static CGEConstString s_cshWaveform = " #version 310 es\n " CGE_SHADER_STRING(
33+ precision highp float ;
34+ precision highp int ;
35+ layout (local_size_x = 1 , local_size_y = 1 , local_size_z = 1 ) in;
36+ layout (rgba8ui, binding = 0 ) uniform readonly highp uimage2D inputImageTexture;
37+ layout (rgba8ui, binding = 1 ) uniform writeonly highp uimage2D outputImage;
38+
39+ void main () {
40+ ivec2 texCoord = ivec2 (gl_GlobalInvocationID);
41+ uvec3 color = imageLoad (inputImageTexture, texCoord).rgb ;
42+ float lum = dot (vec3 (color.rgb ), vec3 (0.299 , 0.587 , 0.114 ));
43+ ivec2 newLoc = ivec2 (texCoord.x , uint (lum));
44+ imageStore (outputImage, newLoc, uvec4 (255 , 255 , 255 , 255 ));
45+ });
46+
3247namespace CGE
3348{
34- CGEWaveformFilter::~CGEWaveformFilter ()
35- {
36- }
49+ CGEWaveformFilter::~CGEWaveformFilter () = default ;
3750
3851bool CGEWaveformFilter::init ()
3952{
40- if (initShadersFromString (s_vshWaveform, s_fshWaveform ))
53+ if (m_program. initWithComputeShader (s_cshWaveform ))
4154 {
4255 m_program.bind ();
4356 setFormPosition (0 .1f , 0 .1f );
@@ -49,6 +62,18 @@ bool CGEWaveformFilter::init()
4962 return true ;
5063 }
5164
65+ // if (initShadersFromString(s_vshWaveform, s_fshWaveform))
66+ // {
67+ // m_program.bind();
68+ // setFormPosition(0.1f, 0.1f);
69+ // setFormSize(0.3f, 0.3f);
70+ // setColor(0.0f, 0.0f, 0.0f, 0.5f);
71+ // m_drawer.reset(TextureDrawer::create());
72+ // m_drawer->setFlipScale(1.0f, -1.0f); // flip upside down, meet the gl coord.
73+ // m_renderTarget = std::make_unique<FrameBufferWithTexture>();
74+ // return true;
75+ // }
76+
5277 CGE_LOG_ERROR (R"( CGEWaveformFilter::init failed. This filter needs GLES3.1 and later!
5378 Only GLES 3.1+ support image store.
5479 You need to imp a fallback version which reading pixels every frame like `cgeColorMappingFilter`
@@ -70,29 +95,16 @@ void CGEWaveformFilter::render2Texture(CGEImageHandlerInterface* handler, GLuint
7095 glClearColor (0 , 0 , 0 , 1 );
7196 glClear (GL_COLOR_BUFFER_BIT);
7297
73- // / 在部分低端机型上, glClear 可能会发生在 shader write 之后. 这里必须控制一下时序.
74- // / 经过测试, 使用 glMemoryBarrier(GL_ALL_BARRIER_BITS) 也不管用, 但是 glFlush 可以修复此问题
75- // / 暂且这么实现.
76- glFlush ();
98+ glMemoryBarrier (GL_TEXTURE_FETCH_BARRIER_BIT);
7799
78100 m_program.bind ();
79101
80- // / 渲染不写入, 使用 imageStore 写入.
81- glColorMask (false , false , false , false );
82-
83- glBindBuffer (GL_ARRAY_BUFFER, vertexBufferID);
84- glEnableVertexAttribArray (0 );
85- glVertexAttribPointer (0 , 2 , GL_FLOAT, GL_FALSE, 0 , 0 );
86- glActiveTexture (GL_TEXTURE0);
87- glBindTexture (GL_TEXTURE_2D, srcTexture);
88-
89- glActiveTexture (GL_TEXTURE1);
90- glBindTexture (GL_TEXTURE_2D, 0 );
102+ glBindImageTexture (0 , handler->getTargetTextureID (), 0 , GL_FALSE, 0 , GL_READ_ONLY, GL_RGBA8UI);
91103 glBindImageTexture (1 , m_renderTarget->texture (), 0 , GL_FALSE, 0 , GL_WRITE_ONLY, GL_RGBA8UI);
92104
93- glDrawArrays (GL_TRIANGLE_FAN, 0 , 4 );
94- glColorMask ( true , true , true , true );
95- glMemoryBarrier (GL_TEXTURE_FETCH_BARRIER_BIT );
105+ glDispatchCompute (sz. width , sz. height , 1 );
106+
107+ glMemoryBarrier (GL_SHADER_IMAGE_ACCESS_BARRIER_BIT );
96108
97109 handler->setAsTarget ();
98110 glViewport (m_position[0 ] * sz.width , m_position[1 ] * sz.height , m_size[0 ] * sz.width , m_size[1 ] * sz.height );
0 commit comments