问题描述
我正在尝试在窗口中显示一个三角形。我让窗口出现,但窗口是黑色的,窗口中没有出现三角形。着色器文件可以打开(如果不能打开,我会收到 FileNotFoundException),但是三角形不会显示在屏幕上。这是我拥有的代码:
public class GoodbyeSimpleWorld implements GLEventListener,KeyListener {
private static GLWindow window;
private static Animator animator;
float vertices[] = {
-0.5f,-0.5f,0.0f,0.5f,0.0f
};
int shaderProgram;
IntBuffer VAO;
IntBuffer VBO;
int iVBO,iVAO;
public static void main(String[] args) {
new GoodbyeSimpleWorld().setup();
}
private void setup() {
GLProfile glProfile = GLProfile.get(GLProfile.GL3);
GLCapabilities glCapabilities = new GLCapabilities(glProfile);
window = GLWindow.create(glCapabilities);
window.setTitle("Goodbye Simple World");
window.setSize(1024,768);
window.addGLEventListener(this);
window.addKeyListener(this);
window.setVisible(true);
window.addGLEventListener(this);
window.addKeyListener(this);
window.addWindowListener(new WindowAdapter(){
@Override
public void windowDestroyed(WindowEvent e) {
animator.stop();
System.exit(0);
}
});
animator = new Animator();
animator.start();
}
@Override
public void init(GLAutoDrawable drawable) {
GL3 gl = drawable.getGL().getGL3();
shadercode vertexShader = shadercode.create(gl,GL_VERTEX_SHADER,this.getClass(),"shaders/gl3",null,"goodbye","vert",true);
vertexShader.compile(gl);
shadercode fragmentShader = shadercode.create(gl,GL_FRAGMENT_SHADER,"frag",true);
fragmentShader.compile(gl);
shaderProgram = gl.glCreateProgram();
gl.glAttachShader(shaderProgram,vertexShader.id());
gl.glAttachShader(shaderProgram,fragmentShader.id());
gl.glLinkProgram(shaderProgram);
gl.glDeleteShader(vertexShader.id());
gl.glDeleteShader(fragmentShader.id());
VBO = GLBuffers.newDirectIntBuffer(1);
VAO = GLBuffers.newDirectIntBuffer(1);
gl.glGenVertexArrays(1,VAO);
gl.glGenBuffers(1,VBO);
iVBO = VBO.get();
iVAO = VAO.get();
gl.glBindVertexArray(iVAO);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER,iVBO);
gl.glBufferData(GL.GL_ARRAY_BUFFER,vertices.length,FloatBuffer.wrap(vertices),gl.GL_STATIC_DRAW);
gl.glVertexAttribPointer(0,3,GL.GL_FLOAT,false,3 * Float.BYTES,0);
gl.glEnabLevertexAttribArray(0);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER,0);
gl.glBindVertexArray(0);
}
@Override
public void display(GLAutoDrawable drawable) {
GL3 gl = drawable.getGL().getGL3();
drawable.setAutoSwapBufferMode(true);
gl.gluseProgram(shaderProgram);
gl.glBindVertexArray(iVAO);
gl.glDrawArrays(GL_TRIANGLES,3);
gl.glBindVertexArray(iVAO);
}
...
}
解决方法
我发现了几个问题:
-
VBO
是包含 VBO 的 name 的缓冲区,但是您将它传递给glBufferData
,您要在其中存储数据 VBO 是预期的,您永远不会将vertices
数组复制到缓冲区中 - 你用
glVertexAttribPointer
调用Long.MIN_VALUE
,它大约是 -2^63,但你应该放在那里的值是0
- 当您进行实际绘制调用时,您没有绑定 VAO
- 您永远不会在任何地方接到
SwapBuffers
电话。请注意,可以将 GLEventListener 设置为setAutoSwapBufferMode
模式来为您执行此操作,但这只会影响dispay
方法,在init
中调用绘制调用没有多大意义。