0
간단한 장면을 프레임 버퍼에 렌더링 한 다음이 텍스처를 쉐이더에 텍스처로 전달하려고합니다. 그러나 렌더링 된 객체는 검은 색으로 보입니다. 나는 내가 잘못한 것을 알아낼 수 없다.프레임 버퍼 객체, 셰이더에 텍스처 렌더링 및 전달 문제가 발생했습니다.
아래 코드에서 FBO를 만들고 깊이 버퍼와 텍스처를 첨부합니다.
GLuint fbo, fboDepth,fboTexture;
// Create the texture
glGenTexturesEXT(1, &fboTexture);
glBindTextureEXT(GL_TEXTURE_2D, fboTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 512, 512, 0, GL_RGBA, GL_FLOAT, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
// Create and bind an FBO
glGenFramebuffersEXT(1, &fbo);
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fbo);
// Create depth renderbuffer
glGenRenderbuffersEXT(1, &fboDepth);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, fboDepth);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, 512, 512);
glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, fboTexture, 0);
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, fboDepth);
GLenum fboStatus = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER_EXT);
if (fboStatus != GL_FRAMEBUFFER_COMPLETE) {
std::cout << "Couldn't create frame buffer" << std::endl;
exit(0);
} else {
cout << fbo << fboTexture << fboDepth << endl;
}
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); // Reset framebuffer binding
아래의 코드는 내 렌더링 방법입니다. tga 텍스처로 시도해 보았지만 잘 작동합니다.
void Renderer::render(Geometry* geo) {
glUseProgram(geo->shader->program);
// Bind our frame buffer for rendering
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
glPushAttrib(GL_VIEWPORT_BIT | GL_ENABLE_BIT);
glViewport(0, 0, 512, 512);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// render a triangle to the fbo
glBegin(GL_TRIANGLES);
glColor3f(1,0,0);
glVertex2f(-1,0);
glColor3f(0,1,0);
glVertex2f(1,-1);
glColor3f(0,0,1);
glVertex2f(.5,.5);
glEnd();
glPopAttrib();
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
GLuint texUniLoc = glGetUniformLocation(geo->shader->program, "Tex");
glActiveTexture(GL_TEXTURE0 + 1);
glBindTextureEXT(GL_TEXTURE_2D, fboTexture);
glUniform1i(texUniLoc, 1);
GLuint vpm = glGetUniformLocation(geo->shader->program, "ViewProjectionMatrix");
glUniformMatrix4fv(vpm, 1, GL_TRUE, ViewProjectionMatrix.vec);
float * m = (float*)malloc(sizeof(float)*16);
m[0] = 1; m[1] = 0; m[2] = 0; m[3] = 0;
m[4] = 0; m[5] = 1; m[6] = 0; m[7] = 0.0;
m[8] = 0; m[9] = 0; m[10] = 1; m[11] = 0.0;
m[12] = 0; m[13] = 0; m[14] = 0; m[15] = 1.0;
GLuint model = glGetUniformLocation(geo->shader->program, "ModelMatrix");
glUniformMatrix4fv(model, 1, GL_TRUE, m);
// activate and specify pointer to vertex array
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_INDEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, geo->vertices);
glTexCoordPointer(2, GL_FLOAT, 0, geo->texcoords);
glDrawElements(GL_TRIANGLES, 2*3*32*32, GL_UNSIGNED_SHORT, geo->indices);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_INDEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glUseProgram(0);
}
텍스쳐를 시도했는데 셰이더가 잘 작동합니다. 나는 glfw를 사용하고 glew. 또한 glSomeFunction과 glSomeFunctionEXT의 차이점에 대해 확신이 없습니다.
여기 왜 malloc을 사용하는지 잘 모르겠습니다. 메모리를 할당하는 것은 절대적으로 끔찍한 방법이며 할당 된 메모리를 glUniform으로 전달한 후에는 삭제하지 않으므로 바로 누출 될 것입니다. 왜 그냥 떠 다니는거야? [16]? – Robinson
맞습니다. 매우 일시적이었습니다. – nyvaken