프레임 버퍼 오브젝트를 설정하는 방법을 제어 할 수없는 프레임 버퍼 오브젝트로 작업하려고합니다. 그래서 저는 텍스처를 그리기 위해 깊이가있는 오프 스크린 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();
하고 나를 새로운 버퍼를 생성에서 그것을 유지하는 나는 초기화에 0으로 FBO, renderBuffer 및 texColorBuffer을 설정합니다.
그래서 본질적으로 나는 완전히 모양새를 만들기 위해 만든 fbo를 리바 인딩 할 때까지 버퍼를 생성합니다. 원래 fbo로 다시 전환하고 그려 봅니다.
여기서 사용되는 [outTex target]은 GL_TEXTURE_RECTANGLE_ARB입니다.
이
내가 OpenGL을 프로파일 러의 나의 질감 부분에있는 것입니다 : 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;
}
당신이 게시 할 수있는 모든 기회를 [sscce] (http://sscce.org/)하는 우리가 어떻게 도울 수 있는지 보여줄 수 있을까요? 우리가 최선을 다해 여전히 위의 코드로 놓인 오류를 피할 수 있습니다. 건배 :) – GMasucci