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