Opengl 我可以使用纹理贴图结果作为新的纹理数据吗?

Opengl 我可以使用纹理贴图结果作为新的纹理数据吗?,opengl,glfw,Opengl,Glfw,我使用OpenGL并将纹理图像映射到2D多边形,2D多边形是由OpenCV生成的顶点集 我的问题是,我是否可以使用纹理贴图的结果作为新纹理,该纹理已被第一次贴图扭曲,以与其他多边形进行贴图。 我认为我的解释很糟糕,请看例子 左边的图像是我的纹理,右边是映射到多边形后的纹理,纹理被划分为8个块,用于8组顶点。我想做的是使用右侧的贴图结果作为新纹理 可以使用OpenGL或OpenCV?将场景渲染为。将场景渲染为。您需要2个FBO和2个纹理 将场景渲染到第一个FBO fbo1,并将纹理纹理1发送到着

我使用OpenGL并将纹理图像映射到2D多边形,2D多边形是由OpenCV生成的顶点集

我的问题是,我是否可以使用纹理贴图的结果作为新纹理,该纹理已被第一次贴图扭曲,以与其他多边形进行贴图。 我认为我的解释很糟糕,请看例子

左边的图像是我的纹理,右边是映射到多边形后的纹理,纹理被划分为8个块,用于8组顶点。我想做的是使用右侧的贴图结果作为新纹理


可以使用OpenGL或OpenCV?

将场景渲染为。

将场景渲染为。

您需要2个FBO和2个纹理

将场景渲染到第一个FBO fbo1,并将纹理纹理1发送到着色器,然后将场景渲染到第二个FBO fbo2。之后,将第二个纹理纹理2发送到着色器,并在主FBO中渲染场景以显示场景,或在第一个FBO中渲染场景以进行另一个过程

例如:

1在FBO1中渲染场景 2将纹理1发送到着色器 3渲染在FBO2中修改的纹理1 4将纹理2发送到着色器 5在FBO1中渲染纹理2修改器 6将纹理1发送到着色器 等等,等等

这是我的一个项目的一个小代码,用来描述我试图解释的东西

//render the scene to the fbo1
glBindFramebuffer(GL_FRAMEBUFFER, f1);
glClearColor(0.2f, 0.2f, 0.2f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[self drawWithShader:_programRTT];

//apply horizontal blur the result go in the fbo2
glBindFramebuffer(GL_FRAMEBUFFER, f2);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, t1);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[self drawWithShader:_programBH];

//apply vertical blur the result go in the fbo1
glBindFramebuffer(GL_FRAMEBUFFER, f1);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, t2);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[self drawWithShader:_programBV];

//return to the main fbo and display result on screen
[view bindDrawable];
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, t1);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[self drawWithShader:_program];

你需要2个FBO和2个纹理

将场景渲染到第一个FBO fbo1,并将纹理纹理1发送到着色器,然后将场景渲染到第二个FBO fbo2。之后,将第二个纹理纹理2发送到着色器,并在主FBO中渲染场景以显示场景,或在第一个FBO中渲染场景以进行另一个过程

例如:

1在FBO1中渲染场景 2将纹理1发送到着色器 3渲染在FBO2中修改的纹理1 4将纹理2发送到着色器 5在FBO1中渲染纹理2修改器 6将纹理1发送到着色器 等等,等等

这是我的一个项目的一个小代码,用来描述我试图解释的东西

//render the scene to the fbo1
glBindFramebuffer(GL_FRAMEBUFFER, f1);
glClearColor(0.2f, 0.2f, 0.2f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[self drawWithShader:_programRTT];

//apply horizontal blur the result go in the fbo2
glBindFramebuffer(GL_FRAMEBUFFER, f2);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, t1);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[self drawWithShader:_programBH];

//apply vertical blur the result go in the fbo1
glBindFramebuffer(GL_FRAMEBUFFER, f1);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, t2);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[self drawWithShader:_programBV];

//return to the main fbo and display result on screen
[view bindDrawable];
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, t1);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[self drawWithShader:_program];

你能解释一下吗?如何从纹理映射的结果可以作为新的纹理使用FBO。。。我试着读书,但我真的不太懂。谢谢:创建和激活FBO时,所有OpenGL渲染都将从主帧缓冲区重新路由到FBO。可以将纹理连接到FBO,以便FBO上的任何渲染也会对纹理进行。然后关闭FBO,像往常一样绑定纹理对象,并在主帧缓冲区中渲染所需的任何内容。然而,我有几个问题,1。如果纹理从图像加载,然后映射到一个对象,例如多边形,则我们使用此映射结果映射到下一个对象,并在程序仍在运行时继续。在这种情况下,FBO是可能的吗?2.正如我试图理解的,仅当我们绘制场景渲染图像(即茶壶)并用作对象的纹理时,才会显示一个示例。但在这种情况下有点不同,我加载纹理并进行一些映射,希望使用此结果映射到下一个对象?这是可能的。谢谢。首先我接受这个方法似乎可以用于我的提议。但是,我没有试过。你能解释一下吗?如何从纹理映射的结果可以作为新的纹理使用FBO。。。我试着读书,但我真的不太懂。谢谢:创建和激活FBO时,所有OpenGL渲染都将从主帧缓冲区重新路由到FBO。可以将纹理连接到FBO,以便FBO上的任何渲染也会对纹理进行。然后关闭FBO,像往常一样绑定纹理对象,并在主帧缓冲区中渲染所需的任何内容。然而,我有几个问题,1。如果纹理从图像加载,然后映射到一个对象,例如多边形,则我们使用此映射结果映射到下一个对象,并在程序仍在运行时继续。在这种情况下,FBO是可能的吗?2.正如我试图理解的,仅当我们绘制场景渲染图像(即茶壶)并用作对象的纹理时,才会显示一个示例。但在这种情况下有点不同,我加载纹理并进行一些映射,希望使用此结果映射到下一个对象?这是可能的。谢谢。首先我接受这个方法似乎可以用于我的提议。但是,我没有试过。你能不能写一些例子来加载纹理图像,就像图片加载到帧缓冲区对象一样?因为很多例子我花了很多时间试图理解,我想我了解一些关于如何工作,但我知道的不多。你的例子会让我明白的。非常感谢您当您说将纹理图像加载到帧缓冲区对象时,您是否询问如何将纹理赋予将渲染场景的着色器,或者如何创建链接到帧缓冲区的纹理?我应该怎么做
对不起,我的英语解释不好。。。例如,我创建纹理对象,获取textureID,并通过glTexImage2D将一些图片加载到此对象。创建Framebuffer对象,获取fboID,然后,我可以通过glFramebufferTexture2D指向正在加载某些图像的textureID将textureID直接加载到Framebuffer吗?…:glFramebufferTexture2D将纹理链接到帧缓冲区,以便在将场景渲染到帧缓冲区时,场景将打印到此纹理。如果你想加载一个纹理,我想你想显示这个纹理。因此,您不需要将纹理发送到帧缓冲区,而是在将其显示到帧缓冲区的着色器中。您是否可以编写一些示例来加载纹理图像,就像将图片加载到帧缓冲区对象一样?正如我花费大量时间试图理解的许多示例一样,我想我已经了解了它们的工作原理,但我知道的不多。你的例子会让我明白的。非常感谢当您说将纹理图像加载到帧缓冲区对象时,您是否询问如何将纹理赋予将渲染场景的着色器,或者如何创建链接到帧缓冲区的纹理?我应该如何解释抱歉,英文解释不好。。。例如,我创建纹理对象,获取textureID,并通过glTexImage2D将一些图片加载到此对象。创建Framebuffer对象,获取fboID,然后,我可以通过glFramebufferTexture2D指向正在加载某些图像的textureID将textureID直接加载到Framebuffer吗?…:glFramebufferTexture2D将纹理链接到帧缓冲区,以便在将场景渲染到帧缓冲区时,场景将打印到此纹理。如果你想加载一个纹理,我想你想显示这个纹理。因此,您不向帧缓冲区发送纹理,而是在着色器中发送纹理,该着色器将向帧缓冲区显示纹理。