模板缓冲区在不同显卡上的作用不同

Posted

技术标签:

【中文标题】模板缓冲区在不同显卡上的作用不同【英文标题】:Stencil buffer acts differently on different graphics cards 【发布时间】:2016-02-07 14:48:33 【问题描述】:

我正在用 lwjgl/opengl 渲染我的世界中的传送门。为了提高性能并使多个门户可以相互渲染,我尝试使用模板缓冲区将绘制的场景剪辑到门户所在的位置。

但这仅适用于 Intel 卡,不适用于 Nvidia/AMD。关于模板缓冲区,卡片的功能有什么区别吗?

glEnable(GL_STENCIL_TEST);
for(Portal portal : portals)

    //PREPARE STENCIL BUFFER
    glColorMask(false, false, false, false);
    glDepthMask(false);
    glStencilFunc(GL_NEVER, 1, 0xFF);
    glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP);
    glClear(GL_STENCIL_BUFFER_BIT);
    portalShader.start();
    renderPortal(portal, camera);
    portalShader.stop();


    glColorMask(true, true, true, true);
    glDepthMask(true);
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
    glStencilFunc(GL_LEQUAL, 1, 0xFF);//Fill one or more


    //Render scene that is visible through the portal
    Camera newCam = portal.getDestinationCamera(camera);
    List<Light> combinedLights = portal.getLights(lights);

    float near = Vector3f.sub(portal.getDestination().getPosition(), newCam.getPosition(), null).length() - portal.getDestination().getScale().x / 2f;
    Matrix4f projectionMatrix = Maths.createProjectionMatrix(Math.max(0.1f, near), 1000f, mainRenderer.FOV);
    mainRenderer.entityShader.start();
    mainRenderer.entityShader.loadProjectionMatrix(projectionMatrix);

    mainRenderer.render(entities, combinedLights, newCam);

    glClear(GL_DEPTH_BUFFER_BIT);

glDisable(GL_STENCIL_TEST);

//render portals to depth buffer

//render main scene

【问题讨论】:

您是否指定了包含模板缓冲区的像素格式? 不。非常感谢!!! 【参考方案1】:

哎哟。我在创建显示时忘记请求模板缓冲区。

Display.create(new PixelFormat(32, 0, 24, 8, 0),attribs);

【讨论】:

以上是关于模板缓冲区在不同显卡上的作用不同的主要内容,如果未能解决你的问题,请参考以下文章

NVIDIA 卡上不同的 OpenGL 帧缓冲区 RGBA 值

android opengl 2.0 模板缓冲区不起作用

空白图像(帧缓冲区)

电线上的扁平缓冲器

英特尔高清显卡 - 帧缓冲区不完整?

UE4中多种颜色轮廓线的后期处理