Java 用顶点数组绘制三维多边形
我有一个简短的程序,可以绘制一个3DJava 用顶点数组绘制三维多边形,java,opengl,jogl,vertex-array,Java,Opengl,Jogl,Vertex Array,我有一个简短的程序,可以绘制一个3DGL.GL\u四边形,这里是它的display()方法- public void display(GLAutoDrawable drawable) { .... gl.glBegin(GL.GL_QUADS); // of the color cube // Top-face gl.glColor3f(0.0f, 1.0f, 0.0f); // green gl.glVertex
GL.GL\u四边形,这里是它的display()
方法-
public void display(GLAutoDrawable drawable) {
....
gl.glBegin(GL.GL_QUADS); // of the color cube
// Top-face
gl.glColor3f(0.0f, 1.0f, 0.0f); // green
gl.glVertex3f(1.0f, 1.0f, -1.0f);
gl.glVertex3f(-1.0f, 1.0f, -1.0f);
gl.glVertex3f(-1.0f, 1.0f, 1.0f);
gl.glVertex3f(1.0f, 1.0f, 1.0f);
// Bottom-face
gl.glColor3f(1.0f, 0.5f, 0.0f); // orange
gl.glVertex3f(1.0f, -1.0f, 1.0f);
gl.glVertex3f(-1.0f, -1.0f, 1.0f);
gl.glVertex3f(-1.0f, -1.0f, -1.0f);
gl.glVertex3f(1.0f, -1.0f, -1.0f);
// Front-face
gl.glColor3f(1.0f, 0.0f, 0.0f); // red
gl.glVertex3f(1.0f, 1.0f, 1.0f);
gl.glVertex3f(-1.0f, 1.0f, 1.0f);
gl.glVertex3f(-1.0f, -1.0f, 1.0f);
gl.glVertex3f(1.0f, -1.0f, 1.0f);
// Back-face
gl.glColor3f(1.0f, 1.0f, 0.0f); // yellow
gl.glVertex3f(1.0f, -1.0f, -1.0f);
gl.glVertex3f(-1.0f, -1.0f, -1.0f);
gl.glVertex3f(-1.0f, 1.0f, -1.0f);
gl.glVertex3f(1.0f, 1.0f, -1.0f);
// Left-face
gl.glColor3f(0.0f, 0.0f, 1.0f); // blue
gl.glVertex3f(-1.0f, 1.0f, 1.0f);
gl.glVertex3f(-1.0f, 1.0f, -1.0f);
gl.glVertex3f(-1.0f, -1.0f, -1.0f);
gl.glVertex3f(-1.0f, -1.0f, 1.0f);
// Right-face
gl.glColor3f(1.0f, 0.0f, 1.0f); // violet
gl.glVertex3f(1.0f, 1.0f, -1.0f);
gl.glVertex3f(1.0f, 1.0f, 1.0f);
gl.glVertex3f(1.0f, -1.0f, 1.0f);
gl.glVertex3f(1.0f, -1.0f, -1.0f);
....
}
现在我想将上面的图形更改为“顶点阵列”模式并获得相同的结果,因此我执行了以下操作:
创建了一个float
数组,该数组包含GL.GL_四边形的所有顶点坐标
将此数组放入缓冲区
李>
告诉OpenGL顶点的位置(8个顶点)李>
告诉OpenGL要绘制哪些索引李>
这是我写的主要代码(编辑的)-
公共类DisplayWithArray扩展GLCanvas实现GLEventListener,
键盘监听器{
私有浮动[]立方={1.0f,1.0f,-1.0f,-1.0f,1.0f,-1.0f,-1.0f,
1.0f,1.0f,1.0f,1.0f,1.0f,
1.0f、-1.0f、1.0f、-1.0f、-1.0f、1.0f、-1.0f、-1.0f、-1.0f、1.0f、,
-1.0f,-1.0f,
1.0f、1.0f、1.0f、-1.0f、1.0f、1.0f、-1.0f、-1.0f、1.0f、1.0f、,
-1.0f,1.0f,
1.0f、-1.0f、-1.0f、-1.0f、-1.0f、-1.0f、-1.0f、1.0f、-1.0f、1.0f、,
1.0f,-1.0f,
-1.0f、1.0f、1.0f、-1.0f、1.0f、-1.0f、-1.0f、-1.0f、-1.0f、-1.0f、,
-1.0f,1.0f,
1.0f,1.0f,-1.0f,1.0f,1.0f,1.0f,1.0f,-1.0f,1.0f,1.0f,
-1.0f,-1.0f};
私有浮点[]颜色顶点={0.0f,1.0f,0.0f,0.0f,1.0f,0.0f,0.0f,
1.0f、0.0f、0.0f、1.0f、0.0f、1.0f、0.5f、0.0f、1.0f、0.5f、0.0f、,
1.0f,0.5f,0.0f,1.0f,0.5f,0.0f,1.0f,0.0f,0.0f,0.0f,1.0f,0.0f,
0.0f、1.0f、0.0f、0.0f、1.0f、0.0f、0.0f、1.0f、1.0f、0.0f、1.0f、,
1.0f、0.0f、1.0f、1.0f、0.0f、1.0f、1.0f、0.0f、0.0f、0.0f、1.0f、,
0.0f、0.0f、1.0f、0.0f、0.0f、1.0f、0.0f、0.0f、1.0f、1.0f、0.0f、,
1.0f、1.0f、0.0f、1.0f、1.0f、0.0f、1.0f、1.0f、0.0f、1.0f};
//第一次编辑-GL.GL\U四边形的24个位置
私有整数[]指数=新整数[24];
私有IntBuffer指示符buf;
}
公共显示WithArray(GLCapabilities、int-width、int-height){
对于(int i=0;i而言,错误在于数组的大小不同。顶点位置数组中有24个vec3,而颜色数组中只有6个。因此,当索引数组显示“6”时,它将尝试访问包含6个元素的数组中的第7个条目。因此崩溃
每个数组都使用相同的索引。因此,如果你想有颜色和位置,那么每个颜色必须有一个单独的对应位置。反之亦然。你不能有6种颜色和32个位置。每个属性也不能使用不同的索引。如果你在做索引渲染,它们都必须使用相同的索引。正如我在编辑的文章中提到的,我希望你能看一看。
public class DisplayWithArray extends GLCanvas implements GLEventListener,
KeyListener {
private float[] cubeVertices = { 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f,
1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f,
-1.0f, -1.0f,
1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,
1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f,
1.0f, -1.0f,
-1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f,
-1.0f, 1.0f,
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[] colorVertices ={ 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, 0.5f, 0.0f,
1.0f, 0.5f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f,
1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f };
// 1st edit - 24 positions of the GL.GL_QUADS
private int[] indices = new int[24] ;
private IntBuffer indicesBuf ;
}
public DisplayWithArray(GLCapabilities capabilities, int width, int height) {
for (int i=0 ; i<24 ; i++) {
this.indices[i] = i ;
}
public void init(GLAutoDrawable drawable) {
...
final GL gl = drawable.getGL();
...
setupPointer(gl);
}
public void display(GLAutoDrawable drawable) {
final GL gl = drawable.getGL();
// draw
gl.glDrawArrays(GL.GL_QUADS, 0, 24);
}
public void setupPointer(GL gl) {
FloatBuffer tmpVerticesBuf = BufferUtil
.newFloatBuffer(cubeVertices.length);
;
FloatBuffer tmpColorVerticesBuf = BufferUtil
.newFloatBuffer(colorVertices.length);
for (int i = 0; i < cubeVertices.length; i++) {
tmpVerticesBuf.put(cubeVertices[i]);
}
for (int i = 0; i < colorVertices.length; i++) {
tmpColorVerticesBuf.put(colorVertices[i]);
}
tmpVerticesBuf.rewind();
tmpColorVerticesBuf.rewind();
gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL.GL_FLOAT, 0, tmpVerticesBuf);
gl.glColorPointer(3, GL.GL_FLOAT, 0, tmpColorVerticesBuf);
// Indices of polygon
IntBuffer tmpIndicesBuf = BufferUtil.newIntBuffer(this.indices.length);
for (int i = 0; i < indices.length; i++) {
tmpIndicesBuf.put(indices[i]);
}
tmpIndicesBuf.rewind();
indicesBuf = tmpIndicesBuf ;
}