2016-06-20 133 views
0

我想渲染到立方体贴图。正在渲染的场景是一个地形。 我使用纬度经度调试显示来查看某个立方体贴图中的内容。 左下角的两个调试视图是虚拟立方体贴图,只显示实际图片的方向和一个立方体贴图。OpenGL渲染到立方图

右下半部分的调试视图显示了我在之后的立方体贴图中呈现的内容。

我已经尝试了很多不同的组合设置相机,但没有一个给出了任何逻辑结果。我还将代码与多个示例的代码进行了比较,以实现动态立方体贴图,但仍无法发现问题。我不知道接下来会尝试什么,所以我们欢迎任何帮助或建议。

绘制到立方体贴图功能:

void Draw(GLuint cubemap, glm::ivec2 res, glm::vec3 position) 
{ 

    glBindFramebuffer(GL_FRAMEBUFFER, fbo); 

    glBindRenderbuffer(GL_RENDERBUFFER, rb); 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, res.x, res.y); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rb); 

    // camera 
    glm::mat4 p = glm::perspective(90.0f, 1.0f, 0.01f, 10.0f); 
    glm::mat4 v; 

    glm::vec3 targets[6] = { 
     glm::vec3(+1.0f, 0.0f, 0.0f), 
     glm::vec3(-1.0f, 0.0f, 0.0f), 
     glm::vec3(0.0f, +1.0f, 0.0f), 
     glm::vec3(0.0f, -1.0f, 0.0f), 
     glm::vec3(0.0f, 0.0f, +1.0f), 
     glm::vec3(0.0f, 0.0f, -1.0f) 
    }; 
    glm::vec3 ups[6] = { 
     glm::vec3(0.0f, 1.0f, 0.0f), 
     glm::vec3(0.0f, 1.0f, 0.0f), 
     glm::vec3(0.0f, 0.0f, 1.0f), 
     glm::vec3(0.0f, 0.0f, -1.0f), 
     glm::vec3(0.0f, 1.0f, 0.0f), 
     glm::vec3(0.0f, 1.0f, 0.0f) 
    }; 

    // render 
    for (int i = 0; i < 6; i++) 
    { 
     glViewport(0, 0, res.x, res.y); 
     // setup target face 
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, cubemap, 0); 
     // setup camera 
     v = glm::lookAt(position, position + targets[i], ups[i]); 
     // draw 
     DrawTerrain(terrain.heightmap, terrain.m, v, p); // model, view, projection matrices 
    } 
    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
} 

screenshot

回答

0

矩阵是错误的。对数值进行非常彻底的检查后,glm返回的值对于投影矩阵和视图矩阵都是不正确的。我会看看我是否会报告bugfix的请求,但现在,这里是实际修复矩阵的代码。

// projection matrix (fov = 90 degrees, aspect = 1.0) 
glm::mat4 p; 
float n = 0.1f, f = 2.0f; // near and far 
p[0][0] = 1.0f; 
p[1][1] = 1.0f; 
p[2][2] = -f/(f - n); 
p[2][3] = -1.0f; 
p[3][2] = -(f*n)/(f - n); 

glm::vec3 targets[6] = { 
    glm::vec3(+1.0f, 0.0f, 0.0f), 
    glm::vec3(-1.0f, 0.0f, 0.0f), 
    glm::vec3(0.0f, +1.0f, 0.0f), 
    glm::vec3(0.0f, -1.0f, 0.0f), 
    glm::vec3(0.0f, 0.0f, +1.0f), 
    glm::vec3(0.0f, 0.0f, -1.0f) 
}; 
glm::vec3 ups[6] = { 
    glm::vec3(0.0f, 1.0f, 0.0f), 
    glm::vec3(0.0f, 1.0f, 0.0f), 
    glm::vec3(0.0f, 0.0f, -1.0f), 
    glm::vec3(0.0f, 0.0f, 1.0f), 
    glm::vec3(0.0f, 1.0f, 0.0f), 
    glm::vec3(0.0f, 1.0f, 0.0f) 
}; 
for(int i=0; i<6; ++i) 
{ 
    // view matrix 
    v = glm::lookAt(position, position + targets[i], ups[i]); 
    v[0][2] *= -1.0f; 
    v[1][2] *= -1.0f; 
    v[2][2] *= -1.0f; 
    v[3][2] *= -1.0f; 
    // render... 
} 

编辑:

后Andreas的意见,我研究多一点。

glm::perspective需要以弧度为单位的FOV,但由于每个使用该功能的例子都用度来调用它,所以我从来没有真正怀疑过它。在scrathapixel检查后,我确信透视矩阵是正确的(即使该决定因素是否定的)。所以,FOV处于放射状态,这是我的错误。

但是,lookAt是错误的。我将这个功能与几种资源进行了比较,并且与bgfx's lookAt进行了比较,实际上,整个第三列的符号应该相反。因此,我将视图矩阵的该列乘以-1的更改仍然存在。

+0

嗯,'glm'只是标题,所以你可以很容易地修复它而不是“请求修复”。 'perspective'几乎就是'gluPerspective'的1:1副本,这是一个非常简单的函数,所以我有点困惑如何可能有一个错误。 –

+0

看着'p [2] [2]'的值我怀疑你可能不知道z轴指向相机,而不是远离它。 x轴向右,y轴向上,所以如果坐标系应该是右手的,则z轴需要指向相机。然而,你的矩阵有一个负面的决定因素,这是错误的。 –

+0

@AndreasHaferburg我已经编辑了更多的答案。 –