Java 使用和不使用着色器绘制三角形VBO

Java 使用和不使用着色器绘制三角形VBO,java,opengl,glfw,vbo,Java,Opengl,Glfw,Vbo,我试图在屏幕上画一个简单的红色三角形。如果不使用VBO,代码将按预期工作。当尝试使用VBO(带或不带着色器)绘制它时,它根本没有效果 我的代码: //Works glBegin(GL_TRIANGLES); glVertex3f(0f, 0f, 0.0f); glVertex3f(0.5f, 0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.0f); glEnd(); //Does not work int vertexArrayID = glGenVertexArra

我试图在屏幕上画一个简单的红色三角形。如果不使用VBO,代码将按预期工作。当尝试使用VBO(带或不带着色器)绘制它时,它根本没有效果

我的代码:

//Works
glBegin(GL_TRIANGLES);
glVertex3f(0f, 0f, 0.0f);
glVertex3f(0.5f, 0f, 0.0f);
glVertex3f(0.5f,  0.5f, 0.0f);
glEnd();

//Does not work
int vertexArrayID = glGenVertexArrays();
glBindVertexArray(vertexArrayID);

float[] g_vertex_buffer_data = new float[]{
        0f, 0f, 0.0f,
        0.5f, 00f, 0.0f,
        0.5f,  0.5f, 0.0f,
};

int vertexbuffer = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, FloatBuffer.wrap(g_vertex_buffer_data), GL_STATIC_DRAW);

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);

glVertexAttribPointer(
        0,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
        3,                  // size
        GL_FLOAT,           // type
        false,           // normalized?
        0,                  // stride
        0            // array buffer offset
);

glDrawArrays(GL_TRIANGLES, 0, 3); // 3 indices starting at 0 -> 1 triangle

glDisableVertexAttribArray(0);
glDeleteBuffers(vertexbuffer);
glDeleteVertexArrays(vertexArrayID);


System.out.println(glGetError());
glGetError()始终返回0

我使用默认的、教程复制的着色器来测试我的代码(在使用上述代码之前,我链接并绑定程序):

#版本330核心
//输入顶点数据,此着色器的所有执行都不同。
vec3 Vertu模型空间中的布局(位置=0);
void main(){
gl_Position.xyz=垂直模型空间;
gl_位置w=1.0;
}
#版本330核心
//输出数据
输出vec3颜色;
void main()
{
//输出颜色=红色
颜色=vec3(1,0,0);
}

着色器不会输出到
glGetError()
而是有自己的错误消息表系统,请查看并查找
glGetShaderInfoLog
glGetProgramInfoLog
用法。另外,如果您使用了nVidia,它有时会很有用(自然仅用于调试目的),您是在循环中调用glDrawArrays()还是只调用一次?你有空的地方吗?还要检查浮点顶点数组,修复该00f值。着色器不会输出到
glGetError()
,而是有自己的error mesage系统。请查看并查找
glGetShaderInfoLog
glGetProgramInfoLog
用法。另外,如果您使用了nVidia,它有时会很有用(自然仅用于调试目的),您是在循环中调用glDrawArrays()还是只调用一次?你有空的地方吗?同时检查浮动顶点数组,修复该00f值。