отображать текстуру кадрового буфера за пределами экрана в основной буфер кадров

Я пытаюсь работать с объектом framebuffer, который я не могу контролировать, как он устанавливается. Поэтому я создаю fbo вне экрана с глубиной, чтобы нарисовать мою текстуру. Затем нарисуйте его в основной кадровый буфер. Я нахожусь в точке, где я могу видеть текстуру из ресурсов, используя профилировщик OpenGL, но я просто не могу заставить ее рисовать в основном фреймбуфере.

Вот мой код

GLsizei glSizeWidthEquiv = width;
GLsizei glSizeHeightEquiv = height;

GLint originalFramebuffer;
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &originalFramebuffer);

if(fbo == 0){
glGenFramebuffers(1, &fbo);
}
glBindFramebuffer(GL_FRAMEBUFFER, fbo);

//Creating texture for framebuffer
if(texColorBuffer == 0){
glGenTextures(1, &texColorBuffer);
}
glBindTexture([outTex target], texColorBuffer);
//Having it as null means the texture's data will be created dynamically
//Using RGBA since the alpha layer is going to be needed
glTexImage2D([outTex target], 0, GL_RGBA_FLOAT16_APPLE, glSizeWidthEquiv, glSizeHeightEquiv, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

glTexParameteri([outTex target], GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri([outTex target], GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//Attach texture to framebuffer
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, [outTex target], texColorBuffer, 0);

//Creating render buffer
if(renderBuffer == 0){
glGenRenderbuffers(1, &renderBuffer);
}
glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, glSizeWidthEquiv, glSizeHeightEquiv);

//Binding the renderbuffer to the framebuffer
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderBuffer);

//Check framebuffer
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){
NSLog(@"Framebuffer incomplete noob\n");
}else{
NSLog(@"Framebuffer COMPLETE!\n");
}
//Start to use the frame buffer
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glViewport(0, 0, glSizeWidthEquiv, glSizeHeightEquiv);
//cleaning texture: cleaning code here

//initating glTex0
glActiveTexture(GL_TEXTURE0);

//setting up texture stuff
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0, 0, 0, 1);
glDisable(GL_CULL_FACE);

glColor3f(1,0,0);glBegin(GL_QUADS);
//box 1 in front
glVertex3f(0, 0, 0);
glVertex3f(500, 0, 0);
glVertex3f(500, 500, 0);
glVertex3f(0, 500, 0);

//box 2 at the back
glColor3f(0, 1, 0);
glVertex3f(-250, -250, 50);
glVertex3f(250, -250, 50);
glVertex3f(250, 250, 50);
glVertex3f(-250, 250, 50);
glEnd();

glFogCoordf(9);
//End of framebuffer usage
glBindFramebuffer(GL_FRAMEBUFFER, originalFramebuffer);
glViewport(0, 0, (GLsizei)[outTex width], (GLsizei)[outTex height]);
[self glGetError];

glActiveTexture(GL_TEXTURE0);
glBindTexture([outTex target], texColorBuffer);
glCopyTexSubImage2D([outTex target], 0, 0, 0, 0, 0, glSizeWidthEquiv, glSizeHeightEquiv);glFlush();

Эта часть программы находится в части рендеринга, и я установил для fbo, renderBuffer и texColorBuffer значение 0 при инициализации, чтобы я не мог генерировать новые буферы.

По сути, я создаю буфер до его полного завершения, а затем повторно связываю созданное мной fbo, чтобы нарисовать мою форму. Вернитесь к исходному fbo и попробуйте нарисовать его.

Здесь используется [outTex target] GL_TEXTURE_RECTANGLE_ARB.

Это то, что у меня есть в моей части текстуры OpenGL Profiler:
http://img.photobucket.com/albums/v442/ardo/ScreenShot2013-10-27at112742PM.png

@GMasucci

Я не совсем уверен, является ли это правильным способом создания sscce, но вот код, который легко копировать и вставлять, включая библиотеки, GLUT и OpenGL.
Код, использованный здесь, основан на уроках освещения www.videotutorialsrock.com, так что у меня похожая среда.

#include <iostream>
#include <stdlib.h>

#ifdef __APPLE__
#include <OpenGL/OpenGL.h>
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

using namespace std;

GLuint fbo,texColorBuffer,renderBuffer;
float  camMatrix [4][4];
//Initializes 3D rendering
void initRendering() {
glEnable(GL_DEPTH_TEST);

}

//Called when the window is resized
void handleResize(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (double)w / (double)h, 1.0, 200.0);
}

//Draws the 3D scene
void drawScene() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glTranslatef(0.0f, 0.0f, -8.0f);if(fbo == 0){
glGenFramebuffers(1, &fbo);
}
glBindFramebuffer(GL_FRAMEBUFFER, fbo);

if(texColorBuffer == 0){
glGenTextures(1, &texColorBuffer);
}
glBindTexture(GL_TEXTURE_2D, texColorBuffer);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 400, 400, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texColorBuffer, 0);

if(renderBuffer == 0){
glGenRenderbuffers(1, &renderBuffer);
}
glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 400, 400);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderBuffer);

if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){
printf("Error in framebuffer completeness \n");
}
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glViewport(0, 0, 400, 400);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glActiveTexture(GL_TEXTURE0);

glBegin(GL_QUADS);
glColor3f(1,0,0);
glVertex3f(0, 0, 0);
glVertex3f(200, 0, 0);
glVertex3f(200, 200, 0);
glVertex3f(0, 200, 0);

glColor3f(0, 1, 0);
glVertex3f(-100, -100, -1);
glVertex3f(100, -100, -1);
glVertex3f(100, 100, -1);
glVertex3f(-100, 100, -1);

glEnd();

glFogCoordf(0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, (GLsizei)400, (GLsizei)400);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texColorBuffer);
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 400, 400);

glutSwapBuffers();
}

void update(int value) {
glutPostRedisplay();
glutTimerFunc(25, update, 0);
}

int main(int argc, char** argv) {
//Initialize GLUT
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(400, 400);

//set fbo,texBuffer and renderbuffer to 0
fbo = 0;
texColorBuffer = 0;
renderBuffer = 0;

//Create the window
glutCreateWindow("Lighting - videotutorialsrock.com");
initRendering();

//Set handler functions
glutDisplayFunc(drawScene);
glutReshapeFunc(handleResize);

glutTimerFunc(25, update, 0); //Add a timer

glutMainLoop();
return 0;
}

0

Решение

Никогда не использую glCopyTexSubImage2D до этого это моя лучшая интерпретация со страниц руководства opengl.

от http://www.opengl.org/sdk/docs/man/xhtml/glCopyTexSubImage2D.xml

Blockquote
glCopyTexSubImage2D заменяет прямоугольную часть двухмерного изображения текстуры, изображение текстуры карты куба или линейную часть количества фрагментов текстуры одномерного массива пикселями из текущего GL_READ_BUFFER (а не из основной памяти, как чехол для glTexSubImage2D).

Похоже, вы заменяете то, что в texColorBuffer с originalFramebuffer,

Я рисую объекты кадрового буфера на экране с помощью текстурированных полноэкранных четырехугольников, как показано ниже:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0, 0, 0, 1);
glPushMatrix();
GLfloat identity[4][4];
for (int i=0; i<4; ++i){
for (int j=0; j<4; ++j){
identity[i][j] = 0;
}
}
identity[0][0] = identity[1][1] = identity[2][2] = identity[3][3] = 1;
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(identity);
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(identity);

glActiveTexture(GL_TEXTURE0);
glBindTexture([outTex target], texColorBuffer);

glBegin(GL_QUADS);
glVertex2f(-1,-1);
glTexCoord2f(0, 0);

glVertex2f( 1,-1);
glTexCoord2f(1, 0);

glVertex2f( 1, 1);
glTexCoord2f(1, 1);

glVertex2f(-1, 1);
glTexCoord2f(0, 1);
glEnd();
glPopMatrix();
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]