[英]OpenGL Cube Map Artifacts
我嘗試為 object 反射實現動態立方體 map。 我幾乎成功了,除了我在反射中注意到 object 上的一些偽影。
這些是我用來設置和渲染立方體 map 的主要功能。
bool setup(GLsizei width = 256, GLsizei height = 256)
{
// The framebuffer, which regroups 0, 1, or more textures, and 0 or 1 depth buffer.
if (!fbo)
glGenFramebuffers(1, &fbo);
if (!cubeMap)
glGenTextures(1, &cubeMap);
if (!depthrenderbuffer)
glGenRenderbuffers(1, &depthrenderbuffer); // The depth buffer
for (int i = 0; i < 6; ++i)
{
if (facesFbo[i])
break;
glGenFramebuffers(1, &facesFbo[i]);
//NSLog(@"Generated facesFbo[%u]", i);
}
GLint mainFrameBuffer; // save the previous framebuffer, most probably the main one
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &mainFrameBuffer);
//setup the texture
glActiveTexture(GL_TEXTURE5); // for mixing textures and cubemaps
glBindTexture(GL_TEXTURE_CUBE_MAP, cubeMap);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
//glEnable(GL_TEXTURE_CUBE_MAP);
// allocate
if (!allocatedTextures)
{
for (int i = 0; i < 6; ++i)
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
allocatedTextures = true;
}
//bind it
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, cubeMap, 0);
// set the texture rendering targets
//for (int i = GL_TEXTURE_CUBE_MAP_POSITIVE_X, len = i + 6; i < len; ++i)
if (!attachTextures)
{
for (int i = 0; i < 6; ++i)
{
glBindFramebuffer(GL_FRAMEBUFFER, facesFbo[i]);
//depth
glBindRenderbuffer(GL_RENDERBUFFER, depthrenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthrenderbuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, cubeMap, 0);
}
attachTextures = true;
}
//bring it back
glActiveTexture(GL_TEXTURE0);
// Set the list of draw buffers.
glDrawBuffer(GL_COLOR_ATTACHMENT0); // "1" is the size of DrawBuffers
// restore
glBindFramebuffer(GL_FRAMEBUFFER, mainFrameBuffer);
// Always check that our framebuffer is ok
return (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE);
}
void beginDrawFace(GLenum textarget, GLsizei fxWidth = 256, GLsizei fxHeight = 256)
{
// save the previous frame buffer
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &mainFrameBuffer);
// and the viewport resolution
glGetIntegerv(GL_VIEWPORT, &vp[0]);
// just in case, turn off cube mapping
glDisable(GL_TEXTURE_CUBE_MAP);
// bind it cuz we doin stuff to it
glViewport(0, 0, fxWidth, fxHeight);
//glBindFramebuffer(GL_FRAMEBUFFER, fbo);
//glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + textarget, cubeMap, 0);
glBindFramebuffer(GL_FRAMEBUFFER, facesFbo[textarget]);
// clear stuff out
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LEQUAL);
glClearDepth(1.0f); //used to be 2
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
}
void endDrawFace()
{
// restore
glViewport(vp[0], vp[1], vp[2], vp[3]);
glBindFramebuffer(GL_FRAMEBUFFER, mainFrameBuffer);
}
有沒有人見過這種問題? 我懷疑它與深度緩沖區有關,因為我最近附加了一個以對抗更糟糕的偽影。
我通過縮短遠近平面之間的距離來管理制作這些工件 go 。
使用“glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)”進行第一個面部渲染。
然后只使用“glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);”來渲染所有的 THE OTHER 面。
(您的清除可能略有不同,但您將使用此邏輯使其工作)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.