我正在使用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);
}
这是我得到的结果:
对于我们所知道的,你可能在片段着色器和/或顶点提交中做了一些不正确的事情。发布[SSCCE](http://sscce.org/)。 – genpfault 2014-09-10 18:11:25
@genpfault我编辑了这个问题,请你再看看吗? – 2014-09-10 18:28:24
仍然不是SSCCE。你的实际绘图代码在哪里? – datenwolf 2014-09-10 20:54:56