顶点着色器使GUI消失

时间:2017-11-22 18:14:37

标签: opengl glsl lwjgl

我有一些代码来渲染GUI,如果我不使用顶点着色器,那么它会精确地呈现它的意思:Working as intended

然而,只要我使用顶点着色器,即使只是一个调用

gl_position = vec4(position,1.0);

隐藏,移动或以其他方式使我的GUI消失

在OpenGL中为GUI设置着色器的正确方法是什么?

GUI渲染:

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glOrtho(0, width, 0, height, -10, 10);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glDisable(GL_CULL_FACE);
    glDisable(GL_DEPTH_TEST);
    RendererUtils.setWireframeMode(false);
    for (Interface i : interfaces)
    {
        i.updateShaderForThisB();
        if (i instanceof InterfaceContainer)
        {
            ((InterfaceContainer) i).draw();
        }
        else
        {
            ((InterfaceControl) i).draw();
        }           
    }
    InterfaceShader.getInstance().unbind();
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);

InterfaceContainer和InterfaceControl的绘制调用大致相同,所以我只添加其中一个。

InterfaceControl.draw()

public void draw()
{
    this.updateShaderForThisB();
    this.getMesh().draw();
    if (this.hasText)
    {
        //this.updateShaderForThisF();
        //drawText();
    }

}

InterfaceControl.updateShaderForThisB()

public void updateShaderForThisB()
{
    InterfaceShader shader = InterfaceShader.getInstance();
    shader.bind();
    shader.setColour(this.getActingColour());
    shader.setLocation(this.getLocation());
    shader.setSize(this.getBounds());
    shader.setGradient(this.getShouldGradient());
    shader.updateUniforms();
}

Mesh.draw()

public void draw()
{
    glEnableVertexAttribArray(0); //Vertices
    glEnableVertexAttribArray(1); //Tex coords
    glEnableVertexAttribArray(2); //Normals

    glBindBuffer(GL_ARRAY_BUFFER,vbo);
    glVertexAttribPointer(0, 3, GL_FLOAT, false, Vertex.SIZE * 4, 0);
    glVertexAttribPointer(1, 2, GL_FLOAT, false, Vertex.SIZE * 4, 12);
    glVertexAttribPointer(2, 3, GL_FLOAT, false, Vertex.SIZE * 4, 20);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
    glDrawElements(GL_TRIANGLES, size, GL_UNSIGNED_INT,0);

    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(2);
}

InterfaceShader.vs

#version 330

layout(location = 0) in vec3 position;
layout(location = 1) in vec2 texCoord;
uniform mat4 viewMatrix;

out vec2 texCoord0;

void main()
{
    gl_Position = viewMatrix * vec4(position,1.0);
    texCoord0 = texCoord;
}

任何人都可以看到一个我忽略的明显问题吗?我的第一个想法是着色器将我面向接口的坐标(即50,50,1)转换为真实世界坐标,但我不知道

编辑:根据要求,更新了着色器代码并添加了矩阵投影代码

https://pastebin.com/gKdewDVi

用于Transform类的pastebin,用于获取视图矩阵等,以及它与着色器的关联方式

1 个答案:

答案 0 :(得分:2)

固定函数顶点处理管道将顶点位置乘以GL_PROJECTION * GL_MODELVIEW给出的当前矩阵。您的顶点着色器中的Data model如下:

gl_Position = gl_ModelViewProjectionMatrix * vec4(position,1.0);

请注意,您使用固定功能处理正在使用过时的OpenGL编程实践。这已经被弃用了一段时间。