Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 使用OpenGL ES着色器将图像覆盖到视频上_Iphone_Objective C_Opengl Es - Fatal编程技术网

Iphone 使用OpenGL ES着色器将图像覆盖到视频上

Iphone 使用OpenGL ES着色器将图像覆盖到视频上,iphone,objective-c,opengl-es,Iphone,Objective C,Opengl Es,我试图理解OpenGL的基本概念。一周过去了,我离那还很远。一旦我进入glsl,我知道该做什么,但我发现到达那里有点棘手 我目前能够传入我操纵和呈现的视频像素。然后,我一直在尝试添加一个静态图像作为覆盖。这就是我迷路的地方。我的最终目标是使用来自视频和静态图像的像素数据在同一个片段着色器中结束。我想这意味着我需要两个纹理并传递两个像素缓冲区。我当前正在传递视频像素,如下所示: glGenTextures(1, &textures[0]); //target, texture glBin

我试图理解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;
一旦我在着色器中?似乎无论我尝试什么组合,图像和视频最终都只是这两种类型的视频数据


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

您需要使用glActiveTextureARB进行多文本处理
看一下本教程

你自己都懒得写这段代码了,怎么样?我在我的开源框架内实现了所有这些功能,可以使用如下代码设置摄像机源、插入图像并将图像覆盖到视频上:

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];
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, sourceTexture);
glUniform1i(filterInputTextureUniform, 2);  

glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_2D, filterSourceTexture2);                
glUniform1i(filterInputTextureUniform2, 3);
这一切都在幕后使用OpenGL ES 2.0将片段着色器应用于视频帧和静态图像,它比我在iOS上所知道的任何其他方法都要快。对于支持它的设备,我已经对此进行了调整,以使用一些额外的优化来加快图像和视频帧上传过程

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

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];
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, sourceTexture);
glUniform1i(filterInputTextureUniform, 2);  

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

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

这不适用于他们在这里使用的OpenGL ES 2.0。该教程是针对桌面OpenGL的,其中大部分内容都不适用于此。感谢您的澄清,Brad。。。同时也感谢你为分享你的经历所付出的努力。我已经阅读了你的许多其他答案,也从你之前的例子中学习了很多。我知道你的开源框架(在iPhone上使用opengl时很难错过),也许将来我会使用它,但现在我只是在学习它。我会接受这个答案,明天还会继续。@BlueVoodoo-我试图让这个框架本身成为一个参考,所以我将学到的东西融入其中。如果您想弄清楚这一点,那么在这里可以找到一些示例代码。根据你所描述的,这听起来确实像你有一套制服,但是你把一个纹理单元绑定到两套制服上,而不是一个一个。是的,我刚刚让它工作起来。我的问题出现在glUniform1()调用中。我一次又一次地尝试解决这个问题(随着图像的更改),但经过一些迭代后,在-[GPUImageFramebuffer unlock]的
GPUImageFramebuffer
第269行``NSAssert(framebufferReferenceCount>0@“试图超越帧缓冲区,在使用-imageFromCurrentFramebuffer之前是否忘记调用-useNextFrameForImageCapture?”;“`-我做错了什么?@swalkner-这是一个全新的问题。