簡體   English   中英

帶着色器的頂點緩沖對象/頂點陣列對象

[英]Vertex Buffer Objects/Vertex Array Objects with shaders

我無法將任何內容渲染到屏幕上。

private void initVBO() {
    vao = GL30.glGenVertexArrays();
    GL30.glBindVertexArray(vao);

    float[] vertices = {
            -0.5f, 0.5f, 0f,
            0.5f, 0.5f, 0f,
            0.5f, -0.5f, 0f,
            -0.5f, -0.5f, 0f
    };
    FloatBuffer vertBuffer = BufferUtils.createFloatBuffer(vertices.length);
    vertBuffer.put(vertices);
    vertBuffer.flip();

    this.vboID = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, this.vboID);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertBuffer, GL15.GL_STATIC_DRAW);
    positionAttribute = GL20.glGetAttribLocation(getMaterial().getShader()
            .getProgram(), "position");
    GL20.glEnableVertexAttribArray(positionAttribute);
    GL20.glVertexAttribPointer(positionAttribute, 3, GL11.GL_FLOAT, false, 0,
            0);

    Color c = getMaterial().getColor();
    float[] colors = {
        c.red, c.green, c.blue, c.alpha,
        c.red, c.green, c.blue, c.alpha,
        c.red, c.green, c.blue, c.alpha,
    };
    FloatBuffer colorBuffer = BufferUtils.createFloatBuffer(colors.length);
    colorBuffer.put(colors);
    colorBuffer.flip();

    this.vbocID = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, this.vbocID);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, colorBuffer, GL15.GL_STATIC_DRAW);
    colorAttribute = GL20.glGetAttribLocation(getMaterial().getShader().getProgram
            (), "color");
    GL20.glEnableVertexAttribArray(colorAttribute);
    GL20.glVertexAttribPointer(colorAttribute, 4, GL11.GL_FLOAT, false, 0, 0);

    byte[] indices = {
            0, 1, 2,
            2, 3, 0
    };
    ByteBuffer indicesBuffer = BufferUtils.createByteBuffer(indices.length);
    indicesBuffer.put(indices);
    indicesBuffer.flip();

    this.vboiID = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, this.vboiID);
    GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesBuffer,
            GL15.GL_STATIC_DRAW);

    GL30.glBindVertexArray(0);

    GL20.glDisableVertexAttribArray(positionAttribute);
    GL20.glDisableVertexAttribArray(colorAttribute);

    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
}

public void render() {
    GL20.glUseProgram(getMaterial().getShader().getProgram());

    GL30.glBindVertexArray(this.vao);
    GL20.glEnableVertexAttribArray(positionAttribute);
    GL20.glEnableVertexAttribArray(colorAttribute);

    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, this.vboiID);

    GL11.glDrawElements(GL11.GL_TRIANGLES, 6, GL11.GL_BYTE, 0);

    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
    GL20.glDisableVertexAttribArray(colorAttribute);
    GL20.glDisableVertexAttribArray(positionAttribute);
    GL30.glBindVertexArray(0);
    GL20.glUseProgram(0);
}

着色器正確編譯,並且Im正確綁定了位置和顏色的屬性。 我只是在使用glOrtho,並且設置正確,因為通過即時模式進行繪制就可以了。 我不確定問題可能來自創建索引,還是glVertexAttribPointer中的問題。 我只是想獲得繪制到屏幕上的彩色矩形。

更新:Vertex Shader:

#version 150

in vec3 position;
in vec4 color;

out vec4 passColor;

void main(void) {
  gl_Position = vec4(position, 1.0);
  passColor = color;
}

片段着色器:

#version 150

in vec4 passColor;

out vec4 outColor;

void main(void) {
  outColor = vec4(1.0, 1.0, 1.0, 1.0);
}

我還更新了上面的初始化和渲染代碼。 這也是着色器的加載代碼:

private void load(File vertex, File fragment) {
        this.vertexID = FileUtility.loadShader(vertex, GL20.GL_VERTEX_SHADER);
        this.fragmentID = FileUtility.loadShader(fragment, GL20.GL_FRAGMENT_SHADER);

        programID = GL20.glCreateProgram();
        GL20.glAttachShader(programID, vertexID);
        GL20.glAttachShader(programID, fragmentID);

        GL20.glBindAttribLocation(programID, 0, "position");
        GL20.glBindAttribLocation(programID, 1, "color");

        GL30.glBindFragDataLocation(programID, 0, "outColor");

        GL20.glLinkProgram(programID);
        GL20.glValidateProgram(programID);

        int status = GL20.glGetProgrami(programID, GL20.GL_LINK_STATUS);
        if (status != GL11.GL_TRUE) {
            Log.print(LogLevel.Error, GL20.glGetProgramInfoLog(programID));
        }
    }

這里有很多問題,主要的問題是您的VBO實際上沒有綁定。

您創建,綁定,然后立即取消綁定您的VAO。 所以刪除調用glBindVertexArray(0)或推下來的底部initVBO 另外,在解除綁定VAO之前,請勿解除綁定VBO,否則您的VAO將不會綁定到VBO。

您沒有發布着色器,但是您正在使用VAO,這意味着您至少可以訪問GLSL 1.30。 glOrtho着色器只是簡單地支持,成為deprecacted與GLSL 1.20,並在核心配置文件中刪除。 我強烈建議盡快遠離固定功能矩陣堆棧。 LWJGL有自己的矩陣類,切換應該非常簡單。

除非着色器有其他問題,否則第一件事應該是使某些東西出現在屏幕上

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM