1

我试图了解 OpenGL 的基本概念。一个星期过去了,我离那里还很远。一旦我进入 glsl,我就知道该怎么做,但我发现到达那里有点棘手。

我目前能够传递我操作和呈现的视频像素。然后我一直在尝试添加静止图像作为叠加层。这就是我迷路的地方。我的最终目标是在同一个片段着色器中结束,其中包含来自我的视频和静止图像的像素数据。我想这意味着我需要两个纹理并传递两个像素缓冲区。我目前正在传递这样的视频像素:

glGenTextures(1, &textures[0]);

//target, texture
glBindTexture(GL_TEXTURE_2D, textures[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer);

然后我会用图像中的第二个缓冲区在纹理[1] 上重复这个过程吗?如果是这样,我是否同时绑定 GL_TEXTURE0 和 GL_TEXTURE1?...我的着色器看起来像这样吗?

uniform sampler2D videoData;
uniform sampler2D imageData;

一旦我在着色器中?似乎无论我尝试哪种组合,图像和视频最终都只是这两者中的视频数据。

很抱歉在这里合并了许多问题,只是想清除我的许多假设并继续前进。为了澄清这个问题,我需要做什么才能在所描述的过程中从静止图像中添加像素?(“易于理解”的示例代码或任何类型的提示将不胜感激)。

4

2 回答 2

2

甚至不费心自己编写这段代码怎么样?我在我的开源GPUImage框架中拥有所有这些,并且可以使用如下代码来设置摄像机源、拉入图像并将该图像覆盖在视频上:

videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
filter = [[GPUImageOverlayBlendFilter alloc] init];
[videoCamera addTarget:filter];
inputImage = [UIImage imageNamed:@"WID-small.jpg"];
sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES];
[sourcePicture processImage];            
[sourcePicture addTarget:filter];
[filter addTarget:filterView];
[videoCamera startCameraCapture];

这一切都在幕后使用 OpenGL ES 2.0 将片段着色器应用于视频帧和静止图像,而且它比我在 iOS 上所知道的任何其他东西都快。对于支持它的设备,我对此进行了调整,以使用一些额外的优化来加快图像和视频帧上传过程。

要在此处回答您的具体问题,是的,您将创建两个纹理制服,就像您在此处展示的那样。在使用它们之前,您需要从链接的着色器程序中获取每个返回的标识符。在您的代码中,您需要将两个纹理绑定到两个不同的纹理单元,然后使用类似于以下的代码将这些纹理单元的值分配给您的制服:

glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, sourceTexture);
glUniform1i(filterInputTextureUniform, 2);  

glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_2D, filterSourceTexture2);                
glUniform1i(filterInputTextureUniform2, 3);

我见过人们犯的一个常见错误是在glUniform1i()这里使用纹理名称,而不是纹理绑定到的纹理单元。

于 2012-08-31T19:52:47.400 回答
0

您需要使用 glActiveTextureARB 进行多重纹理查看本教程http://www.clockworkcoders.com/oglsl/tutorial8.htm

于 2012-08-31T19:51:53.287 回答