我想使用 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 ”屏幕截图(下方),您可以看到白色四边形与右下角像素 的颜色相同。我猜四边形没有纹理坐标,所以只使用了右下角的纹素。了解这一点,更好的问题是:我如何禁用纹理?。
最佳答案
我已经通过简单地添加解决了这个问题
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/