我想渲染到立方体贴图。正在渲染的场景是一个地形。 我使用纬度经度调试显示来查看某个立方体贴图中的内容。 左下角的两个调试视图是虚拟立方体贴图,只显示实际图片的方向和一个立方体贴图。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);
}
嗯,'glm'只是标题,所以你可以很容易地修复它而不是“请求修复”。 'perspective'几乎就是'gluPerspective'的1:1副本,这是一个非常简单的函数,所以我有点困惑如何可能有一个错误。 –
看着'p [2] [2]'的值我怀疑你可能不知道z轴指向相机,而不是远离它。 x轴向右,y轴向上,所以如果坐标系应该是右手的,则z轴需要指向相机。然而,你的矩阵有一个负面的决定因素,这是错误的。 –
@AndreasHaferburg我已经编辑了更多的答案。 –