基本 LWJGL 程序中的黑屏
Black screen in basic LWJGL program
所以,我一直在看一些 OpenGL 的 C++ 教程,我试图将代码移植到 Java,但我得到的只是黑屏。我真的找不到这里的错误,我想我已经根据 LWJGL 修改了一些东西。着色器实际上是从教程中复制的,因此它们应该可以工作。我也试过 glfwSetErrorCallback()
但它没有给我任何东西。
主要:
public static void main(String[] args) {
long window;
float[] positions = new float[]{
0.5f, -0.5f,
0.0f, 0.5f,
0.5f, -0.5f
};
if(!glfwInit()){
System.err.println("GLFW Failed to initialize");
System.exit(1);
}
window = glfwCreateWindow(800,600,"Game",0,0);
glfwMakeContextCurrent(window);
GL.createCapabilities();
int id = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, id);
glBufferData(GL_ARRAY_BUFFER, createBuffer(positions), GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, false, 0, 0);
int shader = createShader(readFile("vertexShader.shader"), readFile("fragmentShader.shader"));
glUseProgram(shader);
while(!glfwWindowShouldClose(window)){
glfwPollEvents();
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);
}
glfwTerminate();
}
创建缓冲区:
public static FloatBuffer createBuffer(float[] data) {
FloatBuffer buffer = BufferUtils.createFloatBuffer(data.length);
buffer.put(data);
buffer.flip();
return buffer;
}
创建着色器:
public static int createShader(String vertexShader, String fragmentShader){
int program = glCreateProgram();
int vs = compileShader(vertexShader, GL_VERTEX_SHADER);
int fs = compileShader(fragmentShader, GL_FRAGMENT_SHADER);
glAttachShader(program, vs);
glAttachShader(program, fs);
glLinkProgram(program);
glValidateProgram(program);
glDeleteShader(vs);
glDeleteShader(fs);
return program;
}
编译着色器:
public static int compileShader(String source, int type){
int id = glCreateShader(type);
glShaderSource(id, source);
glCompileShader(id);
if(glGetShaderi(id, GL_COMPILE_STATUS) == GL_FALSE){
System.out.println(glGetShaderInfoLog(id));
glDeleteShader(id);
System.exit(1);
}
return id;
}
您绘制的几何图形不是三角形。第一个和第三个顶点相同。
所以,我一直在看一些 OpenGL 的 C++ 教程,我试图将代码移植到 Java,但我得到的只是黑屏。我真的找不到这里的错误,我想我已经根据 LWJGL 修改了一些东西。着色器实际上是从教程中复制的,因此它们应该可以工作。我也试过 glfwSetErrorCallback()
但它没有给我任何东西。
主要:
public static void main(String[] args) {
long window;
float[] positions = new float[]{
0.5f, -0.5f,
0.0f, 0.5f,
0.5f, -0.5f
};
if(!glfwInit()){
System.err.println("GLFW Failed to initialize");
System.exit(1);
}
window = glfwCreateWindow(800,600,"Game",0,0);
glfwMakeContextCurrent(window);
GL.createCapabilities();
int id = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, id);
glBufferData(GL_ARRAY_BUFFER, createBuffer(positions), GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, false, 0, 0);
int shader = createShader(readFile("vertexShader.shader"), readFile("fragmentShader.shader"));
glUseProgram(shader);
while(!glfwWindowShouldClose(window)){
glfwPollEvents();
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);
}
glfwTerminate();
}
创建缓冲区:
public static FloatBuffer createBuffer(float[] data) {
FloatBuffer buffer = BufferUtils.createFloatBuffer(data.length);
buffer.put(data);
buffer.flip();
return buffer;
}
创建着色器:
public static int createShader(String vertexShader, String fragmentShader){
int program = glCreateProgram();
int vs = compileShader(vertexShader, GL_VERTEX_SHADER);
int fs = compileShader(fragmentShader, GL_FRAGMENT_SHADER);
glAttachShader(program, vs);
glAttachShader(program, fs);
glLinkProgram(program);
glValidateProgram(program);
glDeleteShader(vs);
glDeleteShader(fs);
return program;
}
编译着色器:
public static int compileShader(String source, int type){
int id = glCreateShader(type);
glShaderSource(id, source);
glCompileShader(id);
if(glGetShaderi(id, GL_COMPILE_STATUS) == GL_FALSE){
System.out.println(glGetShaderInfoLog(id));
glDeleteShader(id);
System.exit(1);
}
return id;
}
您绘制的几何图形不是三角形。第一个和第三个顶点相同。