SDL2 + OpenGL彩色几何体

时间:2014-01-27 10:31:47

标签: c++ opengl sdl

我想使用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和白色的图像:

Red Square Green Square Blue Square White Square

看看这些,似乎底层纹理对颜色有一些影响。可能是OpenGL仍然将纹理应用(部分)到四边形?

编辑:

我怀疑现在几何体是使用渲染纹理作为纹理绘制的,即使我称之为glDisable(GL_TEXTURE_2D)。看着白色广场&#34;截图(下图),您可以看到白色四边形与右下角像素的颜色相同。我猜这个四边形没有纹理坐标,所以只使用了右下角的纹素。知道这个,更好的问题:如何禁用纹理?

White Square 2

1 个答案:

答案 0 :(得分:1)

我已经通过简单地添加

解决了这个问题
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,则为像素例程的宽度参数

(来自OpenGL docs