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 LWJGL3和Antons OpengGL教程,不显示简单三角形_Java_Opengl_Lwjgl - Fatal编程技术网

Java LWJGL3和Antons OpengGL教程,不显示简单三角形

Java LWJGL3和Antons OpengGL教程,不显示简单三角形,java,opengl,lwjgl,Java,Opengl,Lwjgl,我已经开始使用LWJGL3和一些教程学习OpenGL。最后,我在github上找到了Anton的一个,我从最基本的一个开始: 我的问题有点类似于这个: 这是我的问题。我用黑色背景创建了一个窗口,但并没有显示三角形。如果您能提供有关我的错误的任何信息,我将不胜感激。这是我的密码: public class HelloWorld { public static void main(String[] args) { long window = NULL;

我已经开始使用LWJGL3和一些教程学习OpenGL。最后,我在github上找到了Anton的一个,我从最基本的一个开始:

我的问题有点类似于这个:

这是我的问题。我用黑色背景创建了一个窗口,但并没有显示三角形。如果您能提供有关我的错误的任何信息,我将不胜感激。这是我的密码:

public class HelloWorld 
{

    public static void main(String[] args) 
    {
        long window = NULL;
        int vao, vbo;

        final float[] points = 
        {
             0.0f,  0.5f,   0.0f, 
             0.5f, -0.5f,   0.0f,
            -0.5f, -0.5f,   0.0f
        };

        final String vertex_shader =
        "#version 410\n" +
        "in vec3 vp;" +
        "void main () {" +
        "   gl_Position = vec4 (vp, 1.0);" +
        "}";

        final String fragment_shader =
        "#version 410\n" +
        "out vec4 frag_colour;" +
        "void main () {" +
        "   frag_colour = vec4 (0.5, 0.0, 0.5, 1.0);" +
        "}";

        int vs, fs, shader_programme;

        if( glfwInit() == GL_FALSE )
        {
            System.err.println("Can't initialize glfw!");
            return;
        }

        window = glfwCreateWindow (640, 480, "Hello Triangle", NULL, NULL);
        if (window == 0) {
            glfwTerminate();
            return;
        }
        glfwMakeContextCurrent (window);


        GL.createCapabilities();


        glEnable (GL_DEPTH_TEST); 
        glDepthFunc (GL_LESS);

        vbo = glGenBuffers();
        glBindBuffer (GL_ARRAY_BUFFER, vbo);
        glBufferData (GL_ARRAY_BUFFER, FloatBuffer.wrap(points),
                      GL_STATIC_DRAW);

        vao = glGenVertexArrays();
        glBindVertexArray (vao);
        glEnableVertexAttribArray (0);
        glBindBuffer (GL_ARRAY_BUFFER, vbo);
        glVertexAttribPointer (0, 3, GL_FLOAT, false, 0, 0);

        vs = glCreateShader (GL_VERTEX_SHADER);
        glShaderSource (vs, vertex_shader);
        glCompileShader (vs);

        fs = glCreateShader (GL_FRAGMENT_SHADER);
        glShaderSource (fs, fragment_shader);
        glCompileShader (fs);

        shader_programme = glCreateProgram ();
        glAttachShader (shader_programme, fs);
        glAttachShader (shader_programme, vs);
        glLinkProgram (shader_programme);

        while ( glfwWindowShouldClose(window) == GL_FALSE ) {

            glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glUseProgram (shader_programme);
            glBindVertexArray (vao);

            glDrawArrays (GL_TRIANGLES, 0, 3);

            glfwPollEvents ();

            glfwSwapBuffers (window);
        }


        glfwTerminate();
        return;
    }

}

它是glEnable(GL_深度_测试);您正在绘制二维形状,深度测试正在删除您的形状。摆脱它,它应该会工作。

所以我的问题的解决方案是使用

FloatBuffer buffer = BufferUtils.createFloatBuffer(points.length);
buffer.put(points);
buffer.rewind();    
glBufferData(GL_ARRAY_BUFFER, buffer, GL_STATIC_DRAW);
而不是

glBufferData(GL_ARRAY_BUFFER, FloatBuffer.wrap(points),GL_STATIC_DRAW);

即使不建议对着色器进行更改(布局=0),它也可以工作。谢谢你的回答。我在LWJGL论坛上发布了这个问题的解决方案。

您假设
vp
属性的位置为0(GlenableVertexAttributeArray和
GlVertexAttributePointer
的第一个参数),但这并没有在任何地方强制执行。尝试在vec3 vp中将顶点着色器中的声明更改为
布局(位置=0)。另外,请确保您的机器至少支持OpenGL 4.1,否则请减少GLSL代码中的版本号。我的机器支持OpenGL 4.1。遗憾的是,更改顶点着色器的delaration并没有改变任何东西。只是为了再次检查,我将调用
glGetString(GL\u版本)
,并确保您获得了预期版本的上下文。另外,使用
glGetError()
检查错误,编译后检查着色器编译状态等。感谢您的回答。我照你说的做了,但我还是看不到三角形。你更改了着色器代码吗?在顶点着色器中,需要vec3 vp中的布局(位置=0);我仍然会使用layout指令,除非您只关心在自己的机器上运行它。根据平台和GPU供应商的不同,如果没有它,它将无法工作。