gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:45:45 25 4
gpt4 key购买 nike

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

我正在使用的代码如下。第二个着色器的输出显示基于颜色的输出,但第一个着色器将数据设置为灰度。因此,我知道这不能按要求工作。

我将不胜感激任何(进一步的!!)帮助。

下面的代码,

干杯,

西蒙

- (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);
}

最佳答案

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

关于ios4 - 将 Opengl 纹理从第一个 fbo 绑定(bind)到第二个 fbo,使用着色器并渲染第二个结果(乒乓球),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5642951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com