Java LWJGL3和Antons OpengGL教程,不显示简单三角形
我已经开始使用LWJGL3和一些教程学习OpenGL。最后,我在github上找到了Anton的一个,我从最基本的一个开始: 我的问题有点类似于这个: 这是我的问题。我用黑色背景创建了一个窗口,但并没有显示三角形。如果您能提供有关我的错误的任何信息,我将不胜感激。这是我的密码:Java LWJGL3和Antons OpengGL教程,不显示简单三角形,java,opengl,lwjgl,Java,Opengl,Lwjgl,我已经开始使用LWJGL3和一些教程学习OpenGL。最后,我在github上找到了Anton的一个,我从最基本的一个开始: 我的问题有点类似于这个: 这是我的问题。我用黑色背景创建了一个窗口,但并没有显示三角形。如果您能提供有关我的错误的任何信息,我将不胜感激。这是我的密码: public class HelloWorld { public static void main(String[] args) { long window = NULL;
public class HelloWorld
{
public static void main(String[] args)
{
long window = NULL;
int vao, vbo;
final float[] points =
{
0.0f, 0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
-0.5f, -0.5f, 0.0f
};
final String vertex_shader =
"#version 410\n" +
"in vec3 vp;" +
"void main () {" +
" gl_Position = vec4 (vp, 1.0);" +
"}";
final String fragment_shader =
"#version 410\n" +
"out vec4 frag_colour;" +
"void main () {" +
" frag_colour = vec4 (0.5, 0.0, 0.5, 1.0);" +
"}";
int vs, fs, shader_programme;
if( glfwInit() == GL_FALSE )
{
System.err.println("Can't initialize glfw!");
return;
}
window = glfwCreateWindow (640, 480, "Hello Triangle", NULL, NULL);
if (window == 0) {
glfwTerminate();
return;
}
glfwMakeContextCurrent (window);
GL.createCapabilities();
glEnable (GL_DEPTH_TEST);
glDepthFunc (GL_LESS);
vbo = glGenBuffers();
glBindBuffer (GL_ARRAY_BUFFER, vbo);
glBufferData (GL_ARRAY_BUFFER, FloatBuffer.wrap(points),
GL_STATIC_DRAW);
vao = glGenVertexArrays();
glBindVertexArray (vao);
glEnableVertexAttribArray (0);
glBindBuffer (GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer (0, 3, GL_FLOAT, false, 0, 0);
vs = glCreateShader (GL_VERTEX_SHADER);
glShaderSource (vs, vertex_shader);
glCompileShader (vs);
fs = glCreateShader (GL_FRAGMENT_SHADER);
glShaderSource (fs, fragment_shader);
glCompileShader (fs);
shader_programme = glCreateProgram ();
glAttachShader (shader_programme, fs);
glAttachShader (shader_programme, vs);
glLinkProgram (shader_programme);
while ( glfwWindowShouldClose(window) == GL_FALSE ) {
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram (shader_programme);
glBindVertexArray (vao);
glDrawArrays (GL_TRIANGLES, 0, 3);
glfwPollEvents ();
glfwSwapBuffers (window);
}
glfwTerminate();
return;
}
}
它是glEnable(GL_深度_测试);您正在绘制二维形状,深度测试正在删除您的形状。摆脱它,它应该会工作。所以我的问题的解决方案是使用
FloatBuffer buffer = BufferUtils.createFloatBuffer(points.length);
buffer.put(points);
buffer.rewind();
glBufferData(GL_ARRAY_BUFFER, buffer, GL_STATIC_DRAW);
而不是
glBufferData(GL_ARRAY_BUFFER, FloatBuffer.wrap(points),GL_STATIC_DRAW);
即使不建议对着色器进行更改(布局=0),它也可以工作。谢谢你的回答。我在LWJGL论坛上发布了这个问题的解决方案。您假设
vp
属性的位置为0(GlenableVertexAttributeArray和GlVertexAttributePointer
的第一个参数),但这并没有在任何地方强制执行。尝试在vec3 vp中将顶点着色器中的声明更改为布局(位置=0)代码>。另外,请确保您的机器至少支持OpenGL 4.1,否则请减少GLSL代码中的版本号。我的机器支持OpenGL 4.1。遗憾的是,更改顶点着色器的delaration并没有改变任何东西。只是为了再次检查,我将调用glGetString(GL\u版本)
,并确保您获得了预期版本的上下文。另外,使用glGetError()
检查错误,编译后检查着色器编译状态等。感谢您的回答。我照你说的做了,但我还是看不到三角形。你更改了着色器代码吗?在顶点着色器中,需要vec3 vp中的布局(位置=0);我仍然会使用layout指令,除非您只关心在自己的机器上运行它。根据平台和GPU供应商的不同,如果没有它,它将无法工作。