【发布时间】:2011-09-22 06:07:54
【问题描述】:
我在使用 OpenGL 3 实现纹理渲染时遇到问题。
我的问题是,在渲染到帧缓冲区后,渲染的对象似乎变形了,这可能意味着某处发生了错误的转换。这是没有意义的,因为当不使用我的帧缓冲区时,对象渲染得很好(见帖子底部)。
目前的结果是这样的:
Current result http://k.minus.com/jZVgUuLYRtapv.jpg
预期的结果是这样的(或类似的东西,这只是 GIMP'd): Expected http://k.minus.com/jA5rLM8lmXQYL.jpg
因此,这意味着我在帧缓冲区设置代码或其他地方做错了什么。但我看不到什么。
FBO通过以下函数设置:
unsigned int fbo_id;
unsigned int depth_buffer;
int m_FBOWidth, m_FBOHeight;
unsigned int m_TextureID;
void initFBO() {
m_FBOWidth = screen_width;
m_FBOHeight = screen_height;
glGenRenderbuffers(1, &depth_buffer);
glBindRenderbuffer(GL_RENDERBUFFER, depth_buffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_FBOWidth, m_FBOHeight);
glGenTextures(1, &m_TextureID);
glBindTexture(GL_TEXTURE_2D, m_TextureID);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_FBOWidth, m_FBOHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, 0);
glGenFramebuffers(1, &fbo_id);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo_id);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_buffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_TextureID, 0);
assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
这是我的绘图框代码,它只需要一个转换矩阵并调用相应的函数。 P 的当前值是一个投影矩阵,以及一个视图矩阵 (V) 的单位矩阵。
void drawBox(const Matrix4& M) {
const Matrix4 MVP = M * V * P;
if (boundshader) {
glUniformMatrix4fv((*boundshader)("MVP"), 1, GL_FALSE, &MVP[0]);
}
glBindVertexArray(vaoID);
glDrawElements(GL_TRIANGLES, sizeof(cube.polygon)/sizeof(cube.polygon[0]), GL_UNSIGNED_INT, 0);
}
void drawStaticBox() {
Matrix4 M(1);
translate(M, Vector3(0,0,-50));
drawBox(M);
}
void drawRotatingBox() {
Matrix4 M(1);
rotate(M, rotation(Vector3(1, 0, 0), rotation_x));
rotate(M, rotation(Vector3(0, 1, 0), rotation_y));
rotate(M, rotation(Vector3(0, 0, 1), rotation_z));
translate(M, Vector3(0,0,-50));
drawBox(M);
}
还有GLUT调用的显示函数。
void OnRender() {
/////////////////////////////////////////
// Render to FBO
glClearColor(0, 0, 0.2f,0);
glBindFramebuffer(GL_FRAMEBUFFER, fbo_id);
glViewport(0, 0, m_FBOWidth, m_FBOHeight);
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
GL_CHECK_ERRORS
colorshader.Use();
boundshader = &colorshader;
drawRotatingBox();
colorshader.UnUse();
/////////////////////////////////////////
// Render to Window
glClearColor(0, 0, 0, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, screen_width, screen_height);
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
GL_CHECK_ERRORS
texshader.Use();
boundshader = &texshader;
glBindTexture(GL_TEXTURE_2D, m_TextureID);
drawStaticBox();
texshader.UnUse();
// Swap le buffers
glutSwapBuffers();
}
还有...必须的纹理着色器代码
顶点
#version 330
in vec2 vUV;
in vec3 vVertex;
smooth out vec2 vTexCoord;
uniform mat4 MVP;
void main()
{
vTexCoord = vUV;
gl_Position = MVP*vec4(vVertex,1);
}
片段
#version 330
smooth in vec2 vTexCoord;
out vec4 vFragColor;
uniform sampler2D textureMap;
void main(void)
{
vFragColor = texture(textureMap, vTexCoord);
}
以下是不使用FBO逻辑时的渲染: What is rendered to the FBO http://k.minus.com/jiP7kTOSLLvHk.jpg
...帮助?
关于我可能做错了什么有什么想法吗? 可根据要求提供更多来源。
【问题讨论】:
-
也许你的渲染缓冲区没问题,但是立方体的纹理坐标在其面上显示渲染缓冲区是错误的。
-
@Neodelphi,就像我在gamedev.stackexchange.com/questions/17554/… 发的交叉帖子一样。你的评论是正确的。多谢了。最好让您的评论成为答案。
标签: c++ c opengl framebuffer opengl-3