我有一些代码来渲染GUI,如果我不使用顶点着色器,那么它会精确地呈现它的意思:
然而,只要我使用顶点着色器,即使只是一个调用
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)转换为真实世界坐标,但我不知道
编辑:根据要求,更新了着色器代码并添加了矩阵投影代码
用于Transform类的pastebin,用于获取视图矩阵等,以及它与着色器的关联方式
答案 0 :(得分:2)
固定函数顶点处理管道将顶点位置乘以GL_PROJECTION * GL_MODELVIEW
给出的当前矩阵。您的顶点着色器中的Data model如下:
gl_Position = gl_ModelViewProjectionMatrix * vec4(position,1.0);
请注意,您使用固定功能处理正在使用过时的OpenGL编程实践。这已经被弃用了一段时间。