2016-02-07 3 views
1

Я отворачиваю порталы в своем мире в 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 
+2

Вы указали формат пикселей, содержащий буфер трафарета? – BDL

+0

Нет. Большое спасибо!!! – Geosearchef

ответ

2

Ouch. Я забыл запросить буфер трафарета при создании Дисплея.

Display.create(new PixelFormat(32, 0, 24, 8, 0),attribs); 
Смежные вопросы