Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 模具缓冲区在Opengl 4.4/LWJGL上不起作用_Java_Opengl_Lwjgl_Portal - Fatal编程技术网

Java 模具缓冲区在Opengl 4.4/LWJGL上不起作用

Java 模具缓冲区在Opengl 4.4/LWJGL上不起作用,java,opengl,lwjgl,portal,Java,Opengl,Lwjgl,Portal,我目前正在使用LWJGL开发一个基本的门户类型的游戏。我使用OpenGL的模具缓冲区绘制通过门户看到的世界。我已经设法让它工作,但当我试图在我的台式电脑而不是笔记本电脑上运行它时,问题出现了。我已经确保代码完全同步,并且它仍然在我的桌面上绘制,就好像我没有调用它一样 glEnable(GL_STENCIL_TEST); 系统信息: 笔记本电脑: CPU:Intel CORE I5。 内存:4GB。 英特尔高清图形处理器 操作系统:Windows 7 Professional 64位 OpenG

我目前正在使用LWJGL开发一个基本的门户类型的游戏。我使用OpenGL的模具缓冲区绘制通过门户看到的世界。我已经设法让它工作,但当我试图在我的台式电脑而不是笔记本电脑上运行它时,问题出现了。我已经确保代码完全同步,并且它仍然在我的桌面上绘制,就好像我没有调用它一样

glEnable(GL_STENCIL_TEST);
系统信息: 笔记本电脑: CPU:Intel CORE I5。 内存:4GB。 英特尔高清图形处理器 操作系统:Windows 7 Professional 64位 OpenGL:3.1.0

桌面: CPU:Intel CORE I7 内存:8GB GPU:NVidia GeForce GTX 760 操作系统:Windows 8 Pro 64位 OpenGL:4.4.0

同样,在我的笔记本电脑上工作正常(它有一个较旧的OpenGL版本),但我还没有在我的桌面上启用模具测试

glIsEnabled(GL_STENCIL_TEST);
仍然返回true

入口图形代码(在入口类中):

用于设置渲染上下文的代码(在每个帧的开头以A3D作为参数调用):


考虑到我的代码在OpenGL 3上运行良好,我很确定这不是问题,但是关于OpenGL 4,我应该知道什么可以打破这一点吗?

默认情况下,OpenGL甚至不一定有模具缓冲区。您可以启用它,并将其设置为您心中的内容,它不会做任何事情,除非您使用实际为其分配存储的像素格式。您可以将用于设置渲染上下文的代码添加到问题中吗?此外,GL版本是您最不关心的问题。更紧迫的问题是,您的台式机运行NV GPU,而笔记本电脑使用Intel。这很可能是不同供应商实现之间的行为差异(例如,一个可能会给您一个模具缓冲区,即使您没有明确请求像素格式,而另一个则没有)。@AndonM.Coleman我在我的设置代码中添加,该代码在每一帧的开头运行。gl调用什么来设置模具缓冲区中的像素格式?没有。OpenGL不控制默认的帧缓冲区,有一个单独的API,如GLX、EGL、WGL、CGL等。通常在Java这样的语言中,语言绑定会对您隐藏所有这些API。尽管如此,我还是希望在创建上下文时看到一个函数,该上下文采用对象,例如-->默认像素格式为最小8位深度,并且没有alpha或模具要求。@AndonM.Coleman好的,看起来已经解决了这个问题。谢谢你,伙计!
public static void preparePortalDraw() {
    glStencilFunc(GL_NEVER, 0, 0xFF);
    glStencilOp(GL_INCR, GL_KEEP, GL_KEEP);
    glClear(GL_STENCIL_BUFFER_BIT);
}

public void draw() {
    draw3D(model, pos, ang);
}

public static void draw(Portal... portals) {

    setRenderMode(A3D); //make sure 3D rendering is enabled
    glEnable(GL_STENCIL_TEST);
    for (Portal portal : portals) {
        preparePortalDraw();
        portal.draw(); //draw onto stencil buffer
        prepareSceneDraw();
        portal.drawScene(); //draw objects as seen through portal
    }
    clearDepthBuffer();
    finishDraw();
    for (Portal portal : portals) {
        portal.draw(); //draw onto depth buffer
    }

    //at this point, the scene is drawn normally
}

public static void prepareSceneDraw() {
    glColorMask(true, true, true, true);
    glDepthMask(true);
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
    glStencilFunc(GL_LEQUAL, 1, 0xFF);
}

public void drawScene() {
    if (linked != null) {
        pushMatrix();
        translate(pos);
        rotateY(ang.yaw - linked.ang.yaw - 180); //linked is the portal paired with this one
        translate(Vector3.negate(linked.pos));
        for (Entity e : worldGeom) {
            e.draw();
        }
        popMatrix();
    }
}

public static void finishDraw() {
    glDisable(GL_STENCIL_TEST);
}
public static void setRenderMode(RenderMode mode) {
    if (mode == AspectRenderer.mode) {
        return;
    }

    if (mode == RenderMode.A3D) {
        glViewport(0, 0, getWidth(), getHeight());
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        float aspect = (float) getWidth() / (float) getHeight();
        gluPerspective(60, aspect, 0.1f, 1000);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_COLOR_MATERIAL);
        glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glShadeModel(GL_SMOOTH);
        glEnable(GL_CULL_FACE);
        glFrontFace(GL_CCW);
        setupCamera();
    } else {
        glDisable(GL_DEPTH_TEST);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0, getCanvasWidth(), 0, getCanvasHeight());
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    }

    AspectRenderer.mode = mode;
}