Java JOGL/OpenGL VBO-如何渲染顶点?
3我有以下ScenerEnder类,实现了GLEventListener。我想我理解了创建缓冲区、存储指向这些缓冲区的指针以及用数据填充这些缓冲区的过程(参见init方法) 我遇到的困难是display()方法。我尝试了几乎所有我在互联网上找到的东西的组合,但我仍然不能画任何东西。有人能告诉我现在该怎么做,所有的缓冲区都装满了等待渲染的数据吗Java JOGL/OpenGL VBO-如何渲染顶点?,java,opengl,jogl,Java,Opengl,Jogl,3我有以下ScenerEnder类,实现了GLEventListener。我想我理解了创建缓冲区、存储指向这些缓冲区的指针以及用数据填充这些缓冲区的过程(参见init方法) 我遇到的困难是display()方法。我尝试了几乎所有我在互联网上找到的东西的组合,但我仍然不能画任何东西。有人能告诉我现在该怎么做,所有的缓冲区都装满了等待渲染的数据吗 package cz.pscheidl.gui; import javax.media.opengl.*; import javax.media.ope
package cz.pscheidl.gui;
import javax.media.opengl.*;
import javax.media.opengl.glu.GLU;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
public class SceneRenderer implements GLEventListener {
private IntBuffer buffers = IntBuffer.allocate(2);
private float[] square = {
-1.0f, -1.0f,
1.0f, -1.0f,
1.0f, 1.0f,
1.0f, 1.0f,
-1.0f, 1.0f,
-1.0f, -1.0f,
};
private float[] colorData = {
255, 0, 0,
255, 255, 0,
0, 255, 0,
0, 255, 0,
0, 0, 255,
255, 0, 0
};
FloatBuffer vertexFB = FloatBuffer.wrap(square);
FloatBuffer colorFB = FloatBuffer.wrap(colorData);
GLU glu = new GLU();
@Override
public void init(GLAutoDrawable glAutoDrawable) {
GL3 gl = glAutoDrawable.getGL().getGL3();
gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);
gl.glEnable(GL2.GL_DEPTH_TEST);
gl.glClearDepthf(10.0f);
gl.glClearColor(0.8f, 0.6f, 0.8f, 1.0f);
gl.glDepthFunc(GL2.GL_LEQUAL);
gl.glGenBuffers(2, buffers);
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, buffers.get(0));
gl.glBufferData(GL2.GL_ARRAY_BUFFER, 4 * 6 * 2, vertexFB, GL3.GL_STATIC_DRAW);
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, buffers.get(1));
gl.glBufferData(GL2.GL_ARRAY_BUFFER, 4 * 6 * 3, colorFB, GL2.GL_STREAM_DRAW);
}
@Override
public void dispose(GLAutoDrawable glAutoDrawable) {
}
@Override
public void display(GLAutoDrawable glAutoDrawable) {
GL3 gl = glAutoDrawable.getGL().getGL3();
gl.glClear(GL3.GL_DEPTH_BUFFER_BIT | GL3.GL_COLOR_BUFFER_BIT);
gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, buffers.get(0));
//After binding the buffer, now WHAT ?
}
@Override
public void reshape(GLAutoDrawable glAutoDrawable, int i, int i2, int i3, int i4) {
GL3 gl = glAutoDrawable.getGL().getGL3();
glu.gluPerspective(80.0f, 1920.0f / 1080.0f, 0.1f, 100f);
}
}
有几件事你还没有做到: 1。着色器
着色器是在gpu上运行的程序。这就是告诉gpu如何处理数据的方式。这就是如何创建一个非常基本的程序,该程序具有顶点和片段着色器,可以显示网格 将其与类级var声明结合起来:
private int program;
IntBuffer vertexArray = IntBuffer.allocate(1);
这将包含在init()函数中:
// Create program.
program = gl.glCreateProgram();
// Create vertexShader.
int vertexShader = gl.glCreateShader(GL2ES2.GL_VERTEX_SHADER);
String[] vertexShaderSource = new String[1];
vertexShaderSource[0] = "#version 330\n" +
"layout(location=0) in vec2 position;\n" +
"layout(location=1) in vec3 color;\n" +
"out vec3 vColor;\n" +
"void main(void)\n" +
"{\n" +
"gl_Position = vec4(position, 0.0, 1.0);\n"
"vColor = vec4(color, 1.0);\n"
"}\n";
gl.glShaderSource(vertexShader, 1, vertexShaderSource, null);
gl.glCompileShader(vertexShader);
// Create and fragment shader.
int fragmentShader = gl.glCreateShader(GL2ES2.GL_FRAGMENT_SHADER);
String[] fragmentShaderSource = new String[1];
fragmentShaderSource[0] = "#version 330\n" +
"in vec4 vColor;\n" +
"out vec4 fColor;\n" +
"void main(void)\n" +
"{\n" +
"fColor = vColor;\n" +
"}\n";
gl.glShaderSource(fragmentShader, 1, fragmentShaderSource, null);
gl.glCompileShader(fragmentShader);
// Attach shaders to program.
gl.glAttachShader(program, vertexShader);
gl.glAttachShader(program, fragmentShader);
gl.glLinkProgram(program);
2。顶点数组
绘制时需要使用两个缓冲区。顶点数组允许您存储多个缓冲区的状态,并将数据发送到着色器程序中的不同位置 将其与类级var声明放在一起:
private int program;
IntBuffer vertexArray = IntBuffer.allocate(1);
在创建缓冲区后,这也会出现在init()函数中:
// Create Vertex Array.
gl.glGenVertexArrays(1, vertexArray);
gl.glBindVertexArray(vertexArray.get(0));
// Specify how data should be sent to the Program.
// VertexAttribArray 0 corresponds with location 0 in the vertex shader.
gl.glEnableVertexAttribArray(0);
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, buffers.get(0));
gl.glVertexAttribPointer(0, 2, GL.GL_FLOAT, false, 0, 0);
// VertexAttribArray 1 corresponds with location 1 in the vertex shader.
gl.glEnableVertexAttribArray(1);
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, buffers.get(1));
gl.glVertexAttribPointer(1, 3, GL.GL_FLOAT, false, 0, 0);
您的display()函数现在应该如下所示:
@Override
public void display(GLAutoDrawable glAutoDrawable) {
GL3 gl = glAutoDrawable.getGL().getGL3();
gl.glClear(GL3.GL_DEPTH_BUFFER_BIT | GL3.GL_COLOR_BUFFER_BIT);
gl.glUseProgram(program)
gl.glBindVertexArray(vertexArray.get(0));
gl.glDrawArrays(GL.GL_TRIANGLES, 0, 6)
}
杂项注释:-您的颜色值应在0到1之间,而不是0到255之间。
-您应该研究销毁您创建的OpenGL对象,以便在程序关闭或不再需要它们时使用。
-我强烈推荐阅读以下教程:和。代码例子是C++,但我发现它们非常有用。我想你需要一些一般的解释:绑定告诉OpenGL你下一次绘制的东西,然后你需要告诉OpenGL实际绘制,然后你需要等待OpenGL完成绘制并在屏幕上显示框架。你有装订,你可以用它画画,你需要查阅一些基本的JOGL教程,看看如何完成(我想它叫swapBuffers什么的)画框。与此同时,我做了一些“研究”,我不清楚VAO和VBO之间的关系。你的帖子让我很高兴。非常感谢。