c++ - SDL2 + OpenGL 彩色几何体

标签 c++ opengl sdl

我想使用 OpenGL 在网络摄像头流上绘图。我正在使用一个名为 screen_surface_SDL_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)。查看“白色方 block ”屏幕截图(下方),您可以看到白色四边形与右下角像素 的颜色相同。我猜四边形没有纹理坐标,所以只使用了右下角的纹素。了解这一点,更好的问题是:我如何禁用纹理?

White Square 2

最佳答案

我已经通过简单地添加解决了这个问题

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 if it is greater than 0, the width argument to the pixel routine otherwise

(来自OpenGL docs)

关于c++ - SDL2 + OpenGL 彩色几何体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21378472/

相关文章:

c++ - QGIS:QgsVectorLayer 和 QgsRasterLayer 的默认构造函数?

c++ - 如何在 C++ 中反转给定的句子(字符串)?

c++ - opengl,如何最好地使用 visual studio 更新标题?

java - 缩放 OpenGL 游戏中的所有图形

c - 为什么我的按钮在使用 C 的 SDL2 中不起作用?

c++ - 为什么 CAF system.registry() 应该在 put(atom_value) 之后自动调用 erase(atom_value)

java - 为什么 lwjgl 不绘制矩形?

c++ - 我正在使用 SDL,这个函数导致我的程序使用我所有的内存

c++ - 如何在 SDL 2.0 中清除屏幕的一部分

c++ - STL算法查找范围内第一个元素的所有元组