2014-09-10 18 views
-1

我正在使用Mesa 10.1.3在我的Linux计算机上使用OpenGL 3.3。我创建窗口时请求一个核心配置文件,因为只有核心配置文件具有OpenGL 3.3。但是当我试图编写一个简单的程序在屏幕上显示一个三角形时,我什么都没有。所以我认为我在代码中的某处搞砸了,但我重新检查了它,它是正确的。为了测试这个,我尝试在Windows中运行该程序,并且它正在按照应有的方式工作。所以我对代码做了更多的尝试;我将顶点着色器中的顶点位置乘以0.001,然后才能看到我的三角形,但即使如此,它仍然不能正常工作。我看到的三角形是一个直角三角形,而我希望它是一个等边三角形(在Windows中我看到一个等边三角形)。所以我的猜测是在使用OpenGL Core profile时顶点位置有点不同,但我不知道如何解决这个问题。我做错了什么,我该怎么做?使用Mesa Core Profile时顶点位置关闭

顺便说一句,这是我的顶点着色器的样子:

#version 330 

in vec3 position; 

void main() 
{ 
    gl_Position = vec4(0.001*position, 1.0); 
} 

片段着色器:

#version 330 

out vec4 fragColor; 

void main() 
{ 
    fragColor = vec4(0.0, 1.0, 1.0, 1.0); 
} 

Shader类:

public Shader() 
    { 
    program = glCreateProgram(); 
    if(program == 0) 
    { 
     System.err.println("Shader creation failed: Could not find valid memory location"); 
     System.exit(1); 
    } 
    } 

    public void bind() 
    { 
    glBindAttribLocation(program, 0, "position"); 
    glUseProgram(program); 
    } 

    public void addVertexShader(String text) 
    { 
    addProgram(text, GL_VERTEX_SHADER); 
    } 

    public void addFragmentShader(String text) 
    { 
    addProgram(text, GL_FRAGMENT_SHADER); 
    } 

    public void addGeometryShader(String text) 
    { 
    addProgram(text, GL_GEOMETRY_SHADER); 
    } 

    public void compile() 
    { 
    glLinkProgram(program); 

    if(glGetProgrami(program, GL_LINK_STATUS) == 0) 
    { 
     System.err.println(glGetProgramInfoLog(program, 1024)); 
     System.exit(1); 
    } 

    glValidateProgram(program); 

    if(glGetProgrami(program, GL_VALIDATE_STATUS) == 0) 
    { 
     System.err.println(glGetProgramInfoLog(program, 1024)); 
     System.exit(1); 
    } 
    } 

    public void addProgram(String text, int type) 
    { 
    int shader = glCreateShader(type); 

    if(shader == 0) 
    { 
     System.err.println("Shader creation failed"); 
     System.exit(1); 
    } 

    glShaderSource(shader, text); 
    glCompileShader(shader); 

    if(glGetShaderi(shader, GL_COMPILE_STATUS) == 0) 
    { 
     System.err.println(glGetShaderInfoLog(shader, 1024)); 
     System.exit(1); 
    } 

    glAttachShader(program, shader); 

    } 

我的顶点数组我创建VBO:

Vertex[] data = new Vertex[] {    
new Vertex(new Vector3f(-0.1f, -0.1f, 0)), 
new Vertex(new Vector3f(0, 1, 0)), 
new Vertex(new Vector3f(1, -1, 0))}; 

我的绘制方法:

public void draw() 
{ 
glEnableVertexAttribArray(0); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
//Vertex is a class which only holds a Vector3f for position, currently, so size is set to 3 
glVertexAttribPointer(0, 3, GL_FLOAT, false, Vertex.SIZE * 4, 0); 
glDrawArrays(GL_TRIANGLES, 0, size); 
glDisableVertexAttribArray(0); 
} 

这是我得到的结果: enter image description here

+0

对于我们所知道的,你可能在片段着色器和/或顶点提交中做了一些不正确的事情。发布[SSCCE](http://sscce.org/)。 – genpfault 2014-09-10 18:11:25

+0

@genpfault我编辑了这个问题,请你再看看吗? – 2014-09-10 18:28:24

+1

仍然不是SSCCE。你的实际绘图代码在哪里? – datenwolf 2014-09-10 20:54:56

回答

1

glBindAttribLocation()电话来得太晚:

glBindAttribLocation(program, 0, "position"); 
glUseProgram(program); 

glBindAttribLocation()需求被称为之前glLinkProgram()有什么作用。您可以移动它,或者在链接后使用glGetAttribLocation()以获取链接器分配给该属性的位置。甚至更加容易,因为你使用GLSL 3.30,你可以在着色器代码指定位置:

layout(location = 0) in vec3 position; 

当使用核心配置文件,你还需要使用顶点数组对象(VAO)。如果您的代码中没有诸如glGenVertexArrays()glBindVertexArray()之类的电话,您将需要这些电话。如果你搜索“OpenGL VAO”或“OpenGL顶点数组对象”,那么在SO或互联网的其他部分应该有大量的例子,所以我不会重复太多。粗略地说,你有这样的事情,你开始初始化你的顶点状态之前:

GLuint vaoId = 0; 
glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 
// calls to glVertexAttribPointer, glEnableVertexAttribArray 

然后,当你准备好画:

glBindVertexArray(vao); 

你的顶点数据定义也像它可能是一个源的麻烦:

Vertex[] data = new Vertex[] {    
new Vertex(new Vector3f(-0.1f, -0.1f, 0)), 
new Vertex(new Vector3f(0, 1, 0)), 
new Vertex(new Vector3f(1, -1, 0))}; 

虽然未示出用于填充入该VBO的代码,传递给glBufferData()的数据需要是平坦的,连续的阵列/ buffe r是浮点数,而这是一个矢量对象引用数组。

+0

我试过在glLinkProgram()之前调用glBindAttribLocation(),然后像你建议的那样添加布局(location = 0)并完全删除glBindAttribLocation(),但两者仍然没有改变任何东西。顺便说一下,我使用Vector3f类中的float值传递给glBufferData(),而不是Vector3f类本身。 – 2014-09-11 21:39:54

+0

您可能也会错过使用VAO。查看添加到答案的内容。如果没有看到相关的代码,很难说出可能缺失/错误的内容。 – 2014-09-11 21:58:12