@@ -37,21 +37,26 @@ struct SimpleRenderer::Impl
3737
3838 Egl egl_;
3939 const int width_, height_;
40+ int channels_ = 3 ;
41+ unsigned int glFormat_ = GL_BGR;
42+ unsigned int cvMatType_ = CV_8UC3;
43+ bool formatSet_;
4044
4145 std::array<cgs::gl::Shader, 2 > shaders_;
4246 cgs::gl::Program program_;
4347 cgs::gl::VertexBuffer<Vertex> vbo_;
4448 cgs::gl::ElementBuffer<uint> ebo_;
4549 cgs::gl::VertexArray vao_;
46- cgs::gl::Texture2D textureIn_, textureOut_;
50+ cgs::gl::Texture2D textureIn_, textureOut_, secondTexture_ ;
4751 cgs::gl::Sampler sampler_;
4852 cgs::gl::FrameBuffer fbo_;
4953
5054 Impl (int width, int height,
5155 const std::string& vertexShader,
5256 const std::string& fragmentShader);
53-
57+ void checkFormat ( const cv::Mat& src);
5458 void render (cv::Mat& dest, const cv::Mat& src);
59+ void render (cv::Mat& dest, const cv::Mat& src, const cv::Mat& secondSrc);
5560};
5661
5762constexpr std::array<Vertex, 4 > SimpleRenderer::Impl::VERTICIES;
@@ -113,7 +118,7 @@ SimpleRenderer::Impl::Egl::Egl() :
113118SimpleRenderer::Impl::Impl (
114119 int width, int height,
115120 const std::string& vertexShader,
116- const std::string& fragmentShader) :
121+ const std::string& fragmentShader) :
117122 width_(width), height_(height),
118123 shaders_({
119124 cgs::gl::Shader (GL_VERTEX_SHADER, vertexShader),
@@ -122,47 +127,50 @@ SimpleRenderer::Impl::Impl(
122127 program_(shaders_),
123128 vbo_(VERTICIES, GL_STATIC_DRAW),
124129 ebo_(INDICIES, GL_STATIC_DRAW),
125- textureIn_(GL_SRGB8, width_, height_), //
126- textureOut_(GL_SRGB8, width_, height_), // Assuming sRGB input and output
130+ textureIn_(GL_SRGB8_ALPHA8, width_, height_), //
131+ textureOut_(GL_SRGB8_ALPHA8, width_, height_), // Assuming sRGB input and output
132+ secondTexture_(GL_SRGB8_ALPHA8, width_, height_),
127133 sampler_(GL_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE),
128134 fbo_(textureOut_)
129135{
130136 // Shaders setup
131137 program_.use ();
132138 glUniform2f (glGetUniformLocation (program_.get (), " resolution" ), width_, height_);
133139 glUniform1i (glGetUniformLocation (program_.get (), " texture" ), 0 );
140+ glUniform1i (glGetUniformLocation (program_.get (), " secondTexture" ), 1 );
134141
135142 // Verticies setup
136143 vao_.mapVariable (vbo_, glGetAttribLocation (program_.get (), " position" ), 3 , GL_FLOAT, 0 );
137144 vao_.mapVariable (ebo_);
138145}
139-
140- void SimpleRenderer::Impl::render (cv::Mat& dest, const cv::Mat& src)
146+ void SimpleRenderer::Impl::checkFormat (const cv::Mat& src)
141147{
142- if (width_ != dest.cols || height_ != dest.rows || CV_8UC3 != dest.type ())
143- {
144- ROS_ERROR_STREAM (
145- " Destination image resolution does not match." <<
146- " width: texture=" << width_ << " , input=" << dest.cols <<
147- " height: texture=" << height_ << " , input=" << dest.rows <<
148- " channel: texture=" << 3 << " , input=" << dest.channels () <<
149- " elemSize1: texture=" << 1 << " , input=" << dest.elemSize1 ());
150- return ;
148+ if (!formatSet_) {
149+ if (src.channels () == 4 )
150+ {
151+ channels_ = 4 ;
152+ glFormat_ = GL_BGRA;
153+ cvMatType_ = CV_8UC4;
154+ }
155+ formatSet_ = true ;
151156 }
152-
153- if (width_ != src.cols || height_ != src.rows || CV_8UC3 != dest.type ())
157+ if (width_ != src.cols || height_ != src.rows || cvMatType_ != src.type ())
154158 {
155159 ROS_ERROR_STREAM (
156- " Source image resolution does not match." <<
157- " width: texture=" << width_ << " , input=" << src.cols <<
158- " height: texture=" << height_ << " , input=" << src.rows <<
159- " channel: texture=" << 3 << " , input=" << src.channels () <<
160- " elemSize1: texture=" << 1 << " , input=" << src.elemSize1 ());
160+ " Image resolution does not match." <<
161+ " width: texture=" << width_ << " , input=" << src.cols <<
162+ " height: texture=" << height_ << " , input=" << src.rows <<
163+ " channel: texture=" << channels_ << " , input=" << src.channels () <<
164+ " elemSize1: texture=" << 1 << " , input=" << src.elemSize1 ());
161165 return ;
162166 }
163-
167+ }
168+ void SimpleRenderer::Impl::render (cv::Mat& dest, const cv::Mat& src)
169+ {
170+ checkFormat (src);
171+ checkFormat (dest);
164172 // Perform rendering
165- textureIn_.write (GL_BGR , GL_UNSIGNED_BYTE, src.data );
173+ textureIn_.write (glFormat_ , GL_UNSIGNED_BYTE, src.data );
166174 textureIn_.bindToUnit (0 );
167175 sampler_.bindToUnit (0 );
168176
@@ -175,7 +183,16 @@ void SimpleRenderer::Impl::render(cv::Mat& dest, const cv::Mat& src)
175183 glFinish ();
176184
177185 // Read result
178- textureOut_.read (GL_BGR, GL_UNSIGNED_BYTE, dest.data , dest.rows * dest.cols * dest.channels ());
186+ textureOut_.read (glFormat_, GL_UNSIGNED_BYTE, dest.data , dest.rows * dest.cols * dest.channels ());
187+ }
188+
189+ void SimpleRenderer::Impl::render (cv::Mat& dest, const cv::Mat& src, const cv::Mat& secondSrc)
190+ {
191+ checkFormat (secondSrc);
192+ secondTexture_.write (glFormat_, GL_UNSIGNED_BYTE, secondSrc.data );
193+ secondTexture_.bindToUnit (1 );
194+ sampler_.bindToUnit (1 );
195+ this ->render (dest, src);
179196}
180197
181198SimpleRenderer::SimpleRenderer (
@@ -198,7 +215,6 @@ catch (cgs::gl::Exception& e)
198215}
199216
200217SimpleRenderer::~SimpleRenderer () = default ;
201-
202218void SimpleRenderer::uniform (const std::string& name, float v1) {
203219 glUniform1f (glGetUniformLocation (impl_->program_ .get (), name.c_str ()), v1);
204220}
@@ -236,7 +252,12 @@ void SimpleRenderer::uniform(const std::string& name, unsigned int v1, unsigned
236252 glUniform4ui (glGetUniformLocation (impl_->program_ .get (), name.c_str ()), v1, v2, v3, v4);
237253}
238254
255+ void SimpleRenderer::render (cv::Mat& dest, const cv::Mat& src, const cv::Mat& secondSrc)
256+ {
257+ impl_->render (dest, src, secondSrc);
258+ }
259+
239260void SimpleRenderer::render (cv::Mat& dest, const cv::Mat& src)
240261{
241262 impl_->render (dest, src);
242- }
263+ }
0 commit comments