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
这个简单的OpenGL/JOGL模板测试有什么问题?_Opengl_Jogl_Stencil Buffer - Fatal编程技术网

这个简单的OpenGL/JOGL模板测试有什么问题?

这个简单的OpenGL/JOGL模板测试有什么问题?,opengl,jogl,stencil-buffer,Opengl,Jogl,Stencil Buffer,我正在学习如何使用模具缓冲区,但到目前为止还没有成功地获得一个甚至是一个简单的例子来工作。事实上,尽管尝试了glStencilOp和glStencilFunc的各种参数组合,我仍然无法看到任何证据表明模具缓冲区正在工作。我开始怀疑我的图形驱动程序Mac Pro、Mac OS X 10.8.5或JOGL 2.0.2不支持它。。。或者我错过了一些基本的东西 以下是我看到的: 我期待着看到红色的钻石被绿色的钻石剪掉。我做错了什么 public class Test { public stat

我正在学习如何使用模具缓冲区,但到目前为止还没有成功地获得一个甚至是一个简单的例子来工作。事实上,尽管尝试了glStencilOp和glStencilFunc的各种参数组合,我仍然无法看到任何证据表明模具缓冲区正在工作。我开始怀疑我的图形驱动程序Mac Pro、Mac OS X 10.8.5或JOGL 2.0.2不支持它。。。或者我错过了一些基本的东西

以下是我看到的:

我期待着看到红色的钻石被绿色的钻石剪掉。我做错了什么

public class Test {

    public static void main(String[] args) {
        GLProfile glprofile = GLProfile.getDefault();
        final GLCapabilities glcapabilities = new GLCapabilities(glprofile);
        final GLCanvas glcanvas = new GLCanvas(glcapabilities);
        final GLU glu = new GLU();

        glcanvas.addGLEventListener(new GLEventListener() {

            @Override
            public void reshape(GLAutoDrawable glautodrawable, int x, int y, int width, int height) {}



            @Override
            public void init(GLAutoDrawable glautodrawable) {
                GL2 gl = glautodrawable.getGL().getGL2();

                glcapabilities.setStencilBits(8);

                gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
                gl.glLoadIdentity();

                glu.gluPerspective(45, 1, 1, 10000);
                glu.gluLookAt(0, 0, 100, 0, 0, 0, 0, 1, 0);

                gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
                gl.glLoadIdentity();
            }



            @Override
            public void dispose(GLAutoDrawable glautodrawable) {}



            @Override
            public void display(GLAutoDrawable glautodrawable) {
                GL2 gl = glautodrawable.getGL().getGL2();

                gl.glEnable(GL.GL_STENCIL_TEST);

                gl.glClearStencil(0x0);
                gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT | GL.GL_STENCIL_BUFFER_BIT);

                gl.glStencilFunc(GL.GL_ALWAYS, 1, 1);
                gl.glStencilOp(GL.GL_REPLACE, GL.GL_REPLACE, GL.GL_REPLACE);
            gl.glStencilMask(0xFF);
                //gl.glColorMask(false, false, false, false);
                //gl.glDepthMask(false);

                gl.glColor3f(0, 1, 0);
                gl.glBegin(GL2.GL_QUADS);
                gl.glVertex2f(-25.0f, 0.0f);
                gl.glVertex2f(0.0f, 15.0f);
                gl.glVertex2f(25.0f, 0.0f);
                gl.glVertex2f(0.0f, -15.0f);
                gl.glEnd();

            gl.glStencilMask(0);
                gl.glStencilFunc(GL2.GL_EQUAL, 1, 1);
                gl.glStencilOp(GL2.GL_KEEP, GL2.GL_KEEP, GL2.GL_KEEP);
                //gl.glColorMask(true, true, true, true);
                //gl.glDepthMask(true);

                gl.glColor3f(1, 0, 0);
                gl.glBegin(GL2.GL_QUADS);
                gl.glVertex2f(-20.0f, 0.0f);
                gl.glVertex2f(0.0f, 20.0f);
                gl.glVertex2f(20.0f, 0.0f);
                gl.glVertex2f(0.0f, -20.0f);
                gl.glEnd();
            }
        });

        final JFrame jframe = new JFrame("One Triangle Swing GLCanvas");
        jframe.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent windowevent) {
                jframe.dispose();
                System.exit(0);
            }
        });

        jframe.getContentPane().add(glcanvas, BorderLayout.CENTER);
        jframe.setSize(640, 480);
        jframe.setVisible(true);
    }
}
您需要调用glStencilMask,它控制写入或不写入的内容。将其设置为“写”或“不写”,在您的案例中绘制一个模板,即菱形,再次设置glStencilMask,然后绘制您想要剪裁的内容

这是一个很好的例子:

编辑:

好的,我想我找到问题了。您需要在程序顶部设置您的功能

final GLCapabilities glcapabilities = new GLCapabilities(glprofile);
glcapabilities.setStencilBits(8);
final GLCanvas glcanvas = new GLCanvas(glcapabilities);
重要的部分是: glcapabilities.setStencilBits8


感谢:

Zero298的想法是正确的,但没有解释为什么您在代码中尝试的方法不起作用。当您了解了帧缓冲区像素格式在OpenGL中的工作原理时,这一点变得更加明显;我将在下面稍微讨论一下这一点,但首先只是重新散列适当的解决方案:

公共静态无效字符串[]args{ GLProfile GLProfile=GLProfile.getDefault; GLCapabilities GLCapabilities=新的GLCapabilities glprofile; //必须在创建渲染上下文之前执行此操作 glcapabilities.setstencillbits 8; 最终GLCanvas GLCanvas=新的GLCanvas GLCanvas能力; 最终谷氨酸=新谷氨酸; 重要的是,在创建渲染上下文画布之前要执行此操作。模具缓冲区不是您需要时可以启用或禁用的-您首先必须选择一种像素格式,为其保留存储空间。由于像素格式从创建渲染上下文起就已固定,因此您需要在创建之前执行此操作你是新来的


实际上你可以使用一个FBO在一个没有模板缓冲的渲染上下文中做模板操作,但是这比你现在应该考虑的要先进得多。如果你想做MSAA的话,FBOS是一个在运行时改变像素格式比创建和破坏你的RE更好得多的方法。der context canvas.

我认为您缺少对glStencilMask的调用,该调用可以进行模板制作。@zero298我尝试了使用glStencilMask和不使用glStencilMask。我将其添加到上面的示例中,该示例仍然生成相同的图像。尝试我的新编辑。在复制和粘贴代码后,更改功能起到了作用。如果这是解决方案,我将非常高兴,但我已经尝试过了,但没有成功。请参见我上面编辑的示例。我得到了相同的结果。@Whiskyspider:仅仅因为您在代码中添加了这一行并不意味着您做得正确。您需要在创建渲染上下文之前设置功能。换句话说,在最终GLCanvas GLCanvas=new glcanvasglasabilities;+1之前,谢谢您的帮助指出这一点。我对@zero298的答案感到挠头,因为事实上,我的init方法中已经有了glcapabilities.setStencilBits8。啊,谢谢,我没有注意到glcapabilities已经出现在代码中。我只是看到它没有出现,并且知道这是一个问题。下次我一定会解释为什么有些东西会起作用。