如何使用OpenGL 3.3在jogl 2中使用索引显示3D对象

时间:2014-10-01 05:33:12

标签: java c++ opengl jogl opengl-3

我尝试使用JOGL 2和OpenGL 3.3编写一个脚本来显示基本的3D对象/多边形三角形,但是当项目编译时我没有收到任何错误并得到一个空白窗口,显示对象出现的位置。所以我的问题是,是否有任何特定的我缺少添加使对象出现..我的代码如下...

    public void init(GL3 gl)
{





    gl.glGenVertexArrays(1, IntBuffer.wrap(temp));

    //create vertice buffers
    int vao = temp[0];

    gl.glBindVertexArray(vao);

    gl.glGenBuffers(1, IntBuffer.wrap(temp));

    int[] temp2 = new int[]{1,1};

    gl.glGenBuffers(2, IntBuffer.wrap(temp2));
    vbo = temp2[0]; 

    ebo = temp2[1];

    //creates vertex array
    float vertices[] = {
                -0.5f,  0.5f, 0.0f,//1,0,0, // Top-left
                 0.5f,  0.5f, 0.0f,//0,1,0, // Top-right
                 0.5f, -0.5f, 0.0f,//0,0,1, // Bottom-right
                -0.5f, -0.5f, 0.0f//1,1,0  // Bottom-left
                        };

    gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo);
    gl.glBufferData(GL.GL_ARRAY_BUFFER, vertices.length * 4,
             FloatBuffer.wrap(vertices), GL.GL_STATIC_DRAW);

    //creates element array

    int elements[] = {
            0,1,2,
            2,3,0
            };
    gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, ebo);
    gl.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, elements.length * 4,
             IntBuffer.wrap(elements), GL.GL_STATIC_DRAW);

    gl.glVertexAttribPointer(0, 3, GL.GL_FLOAT, false, 3*4, 0* 4);

    gl.glEnableVertexAttribArray(0);


}

public void draw(GL3 gl) 
{
    gl.glBindVertexArray(vao);
    gl.glDrawElements(GL.GL_TRIANGLES, 2, GL.GL_UNSIGNED_INT, 0);
}

至于我的着色器的启动位置,它在不同的类中,如下所示。

        //Matrix4 view = new Matrix4(MatrixFactory.perspective(scene.camera.getHeightAngle(),scene.camera.getAspectRatio(),scene.camera.getPosition());
    projection = MatrixFactory.perspective(scene.camera.getHeightAngle(), scene.camera.getAspectRatio(), 0.01f, 100f);
    view = MatrixFactory.lookInDirection(scene.camera.getPosition(), scene.camera.getDirection(), scene.camera.getUp());
    try {
         shader = new Shader(new File("shaders/Transform.vert"), new File("shaders/Transform.frag"));
         shader.compile(gl);
         shader.enable(gl);
            shader.setUniform("projection", projection, gl);
            shader.setUniform("view", view, gl);
        }
        catch (Exception e) {
         System.out.println("message " + e.getMessage());
        }
    for (Shape s : scene.shapes) {
        s.init(gl);
    }

最后,我的着色器文件

#version 330


out vec4 fragColour;
//in vec3 outColour;
void main() {
 fragColour = vec4(1,0,0,1);
}

#version 330
uniform mat4 projection;
uniform mat4 view;
layout(location=0) in vec3 pos;
//layout(location=2) in vec2 texCoord;
//layout(location=1) in vec3 colours;
out vec2 fragTex;
out vec3 outColour;
vec4 newPos;

void main() {
newPos = vec4(pos,1.0);
gl_Position = projection * view * newPos;
//fragTex = texCoord;
//outColour = colours;
}

我不确定我哪里出错了,无论是着色器文件还是实际代码本身..

2 个答案:

答案 0 :(得分:1)

我对JOGL没有经验,我习惯于c ++ GL。但是有几个问题:首先,正如Reto Koradi所说,你使用相同的值ebo, vbo and vao。它应该是,

gl.glGenVertexArrays(1, IntBuffer.wrap(tempV));
int vao = tempV[0];


gl.glGenBuffers(2, IntBuffer.wrap(tempB));
int vbo = tempB[0]; 
int ebo = tempB[1];

最后,您的抽奖似乎有点问题,您似乎跳过了一步。"将数组绑定到想要绘制。"然后画画。

gl.glBindVertexArray (vao);
gl.glDrawElements(GL.GL_TRIANGLES, 2, GL.GL_UNSIGNED_INT, 0);

我希望这些帮助。

答案 1 :(得分:-1)

好的,经过许多令人沮丧的时间。有人帮我解决了这个问题。问题不是制作单独的缓冲区,而是每次都不清除它们,这意味着我需要做

gl.glGenVertexArrays(1,IntBuffer.wrap(temp));

    //create vertice buffers
    vao = temp[0];


    gl.glGenBuffers(1, IntBuffer.wrap(temp));
    vbo = temp[0]; 
    gl.glGenBuffers(1, IntBuffer.wrap(temp));
    ebo = temp[0];

这类似于Hakes然而我不需要一个单独的临时,我只需要每次清除缓冲区。我需要做的另一件事就是放

gl.glBindVertexArray(VAO); 在初始和抽签中。

(编辑) 我实际上不太确定gl.glBindVertexArray(vao);需要在绘制方法