我想使用OpenGL在网络摄像头流上绘制。我使用的是一个包含网络摄像头数据的SDL_Surface
命名screen_surface_
的,我正在使用(1)渲染到屏幕上:
SDL_UpdateTexture(screen_texture_, NULL, screen_surface_->pixels, screen_surface_->pitch);
SDL_RenderClear(renderer_);
SDL_RenderCopy(renderer_, screen_texture_, NULL, NULL);
然后,我尝试在顶部绘制一些几何图形:
glLoadIdentity();
glColor3f(1.0, 0.0, 1.0);
glBegin( GL_QUADS );
glVertex3f( 10.0f, 50.0f, 0.0f ); /* Top Left */
glVertex3f( 50.0f, 50.0f, 0.0f ); /* Top Right */
glVertex3f( 50.0f, 10.0f, 0.0f ); /* Bottom Right */
glVertex3f( 10.0f, 10.0f, 0.0f ); /* Bottom Left */
glEnd( );
glColor3f(1.0, 1.0, 1.0); //<- I need this to make sure the webcam stream isn't pink?
SDL_RenderPresent(renderer_);
我已经使用(摘录)初始化了OpenGL:
glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
glViewport( 0, 0, res_width_, res_height_ );
glClear( GL_COLOR_BUFFER_BIT );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(0.0f, res_width_, res_height_, 0.0f, -1.0f, 1.0f);
子问题:如果我不将重置glColor
为白色,则整个网络摄像头流都将变为粉红色。我觉得很奇怪,因为我认为在第一次调用之前SDl_RenderCopy
已经渲染了该纹理。那么实际上是如何工作的呢?glColor
SDL_RenderCopy
主要问题:我的网络摄像头提要顶部的屏幕左上方有一个整齐的40x40正方形(很好!)。但是,它不是粉红色,而是闪烁的深紫色。似乎取决于背景中的摄像机供稿。你能告诉我我忽略了什么吗?
根据@rodrigo的评论,以下是一些颜色分别设置为R,G,B和白色的图像:
综观这些,似乎基础纹理对颜色有一定影响。可能是OpenGL仍将纹理(的一部分)应用于四边形吗?
我现在怀疑,即使我已调用,也使用渲染纹理作为纹理绘制了几何glDisable(GL_TEXTURE_2D)
。查看“白色正方形”屏幕截图(如下),您可以看到白色四边形与右下像素的颜色相同。我猜四边形没有纹理坐标,因此仅使用了右下角的纹理元素。知道了这个更好的问题:如何禁用纹理化?。
我已经解决了这个问题,只需添加
glcontext_ = SDL_GL_CreateContext(window_);
该SDL_Init
代码。我想我对openGL函数的所有调用(例如glDisable(GL_TEXTURE_2D)
都应用于错误的上下文。我猜想,从SDL显式创建上下文会将正确的上下文设置为活动状态)。
还有其他需要注意的地方:使用后使用纹理几何体SDL_RenderCopy
; 我必须确保重设
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
调用之前glTexImage2d
,因为它使用
GL_UNPACK_ROW_LENGTH,如果大于0,则返回像素例程的width参数
(来自OpenGL文档)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句