Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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
Ios4 将Opengl纹理从第一个fbo绑定到第二个fbo,使用着色器并渲染第二个结果(乒乓球)_Ios4_Opengl Es 2.0 - Fatal编程技术网

Ios4 将Opengl纹理从第一个fbo绑定到第二个fbo,使用着色器并渲染第二个结果(乒乓球)

Ios4 将Opengl纹理从第一个fbo绑定到第二个fbo,使用着色器并渲染第二个结果(乒乓球),ios4,opengl-es-2.0,Ios4,Opengl Es 2.0,我一直在研究乒乓球阴影,并认为我已经破解了我之前的问题。但是,随着对着色器的进一步了解,看起来虽然我能够在FBO A和FBO B上运行着色器,但A的输出没有用作B的源。换句话说,我没有正确绑定它 下面是我正在使用的代码。第二个着色器的输出显示基于颜色的输出,但第一个着色器将数据设置为灰度。因此,我知道这并没有按要求进行 如果有任何(进一步的!!)帮助,我将不胜感激 代码如下: 干杯 西蒙 我认为可能发生的情况是,您仍然在渲染帧缓冲区内存,而不是纹理内存。iirc glFramebufferTex

我一直在研究乒乓球阴影,并认为我已经破解了我之前的问题。但是,随着对着色器的进一步了解,看起来虽然我能够在FBO A和FBO B上运行着色器,但A的输出没有用作B的源。换句话说,我没有正确绑定它

下面是我正在使用的代码。第二个着色器的输出显示基于颜色的输出,但第一个着色器将数据设置为灰度。因此,我知道这并没有按要求进行

如果有任何(进一步的!!)帮助,我将不胜感激

代码如下:

干杯

西蒙


我认为可能发生的情况是,您仍然在渲染帧缓冲区内存,而不是纹理内存。iirc glFramebufferTexture2D不充当解析/复制,而是将帧缓冲区绑定到纹理,以便将来的渲染操作写入纹理。您可能会遇到更多问题,但是我非常确定您对glFramebufferTexture2D的调用应该在您第一次调用glBindFramebuffer之后直接发生。这可能不是你唯一的问题,但它似乎是一个重要的问题。

是的-我尝试在创建纹理后立即将tex_a和tex_B绑定到相应的帧缓冲区,但随后我得到一个锁定屏幕,它永远不会更新。我目前正在检查是否正确清理所有内容并清理着色器(等),以便在我的程序中没有其他人工制品。看起来tex_A不应该绑定到渲染缓冲区,它看起来像是您的纹理输入。另外,我不明白为什么有两个渲染缓冲区。为了完成这一切,一旦绑定了最终的渲染缓冲区(看起来就像正在显示的渲染缓冲区),就永远不会渲染任何东西。从代码的外观来看,从不更新的屏幕似乎暗示渲染缓冲区实际上正在工作。对于当前的代码,如果它工作的话,我不希望显示任何内容。也就是说,我认为您误解了glFramebufferTexture2D的功能。使用该选项可以设置要渲染到的纹理,而不是要从中渲染的纹理,也不是要将当前渲染缓冲区复制到的纹理。
- (void) PingPong:(CVImageBufferRef)cameraframe; 
{
// Standard texture coords for the rendering pipeline
static const GLfloat squareVertices[] = {
    -1.0f, -1.0f,
    1.0f, -1.0f,
    -1.0f,  1.0f,
    1.0f,  1.0f,
};

static const GLfloat textureVertices[] = {
    1.0f, 1.0f,
    1.0f, 0.0f,
    0.0f,  1.0f,
    0.0f,  0.0f,
};

if (context)
{
    [EAGLContext setCurrentContext:context];
}

// Create two textures with the same configuration
int bufferHeight = CVPixelBufferGetHeight(cameraframe);
int bufferWidth = CVPixelBufferGetWidth(cameraframe);

// texture 1
glGenTextures(1, &tex_A);
glBindTexture(GL_TEXTURE_2D, tex_A);
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);

// Using BGRA extension to pull in video frame data directly
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(cameraframe));

// Texture 2
glGenTextures(1, &tex_B);
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);

// Bind framebuffer A
glBindFramebuffer(GL_FRAMEBUFFER, fbo_A);
glViewport(0, 0, backingWidth, backingHeight);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex_A);

// Update uniform values
glUniform1i(uniforms[UNIFORM_VIDEOFRAME], 0);   

// Update attribute values.
glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_TEXTUREPOSITON, 2, GL_FLOAT, 0, 0, textureVertices);
glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITON);

// Use the first shader
glUseProgram(greyscaleProgram);

// Render a quad
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

// Use the second shader
glUseProgram(program);

// Bind framebuffer B
glBindFramebuffer(GL_FRAMEBUFFER, fbo_B);

// Bind texture A and setup texture units for the shader
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex_A);

// Render output of FBO b is texture B
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex_B, 0);

// Update uniform values
glUniform1i(uniforms[UNIFORM_VIDEOFRAME], 0);   

// Update attribute values.
glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_TEXTUREPOSITON, 2, GL_FLOAT, 0, 0, textureVertices);
glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITON);

// Render a quad
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

// Render the whole thing
glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER];

glDeleteTextures(1, &tex_A);
glDeleteTextures(1, &tex_B);
}