我再一次尝试进入openGL,但是像往常一样,当我绕过顶点/顶点/时,我会窒息而且每一个细节都会导致灾难(格式错误,初始化设置不正确,内存保存,等)。
我的主要目标是使用openGL进行2D图形处理,以提高与常规cpu绘图相比的性能。
无论如何,我的openGL渲染器看起来像这样:
package com.derp.testopengl;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLU;
import android.opengl.GLSurfaceView.Renderer;
public class OpenGLRenderer implements Renderer {
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// Set the background color to black ( rgba ).
gl.glClearColor(1.0f, 0.0f, 0.0f, 0.5f); // OpenGL docs.
// Enable Smooth Shading, default not really needed.
gl.glShadeModel(GL10.GL_SMOOTH);// OpenGL docs.
// Depth buffer setup.
gl.glClearDepthf(1.0f);// OpenGL docs.
// Enables depth testing.
gl.glEnable(GL10.GL_DEPTH_TEST);// OpenGL docs.
// The type of depth testing to do.
gl.glDepthFunc(GL10.GL_LEQUAL);// OpenGL docs.
// Really nice perspective calculations.
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, // OpenGL docs.
GL10.GL_NICEST);
}
public void onDrawFrame(GL10 gl) {
// Clears the screen and depth buffer.
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | // OpenGL docs.
GL10.GL_DEPTH_BUFFER_BIT);
// Define the points of my triangle
float floatbuff[] = {
1.0f,0.0f,0.0f,
0.0f,1.0f,0.0f,
-1.0f,0.0f,0.0f
};
// Create memory on the heap
ByteBuffer vbb = ByteBuffer.allocateDirect(3 * 3 * 4);
vbb.order(ByteOrder.nativeOrder());
FloatBuffer vertices = vbb.asFloatBuffer();
// Insert points into floatbuffer
vertices.put(floatbuff);
// Reset position
vertices.position(0);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
// Change color to green
gl.glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
// Pass vertices to openGL
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices);
// Draw 'em
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
public void onSurfaceChanged(GL10 gl, int width, int height) {
// Sets the current view port to the new size.
gl.glViewport(0, 0, width, height);// OpenGL docs.
// Select the projection matrix
gl.glMatrixMode(GL10.GL_PROJECTION);// OpenGL docs.
// Reset the projection matrix
gl.glLoadIdentity();// OpenGL docs.
// Should give a 2D coordinate system that responds to the screen
gl.glOrthof(0.0f, width, 0.0f, height, 0, 200.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();// OpenGL docs.
}
}
它目前在线上崩溃:
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
使用IndexOutOfBoundsException,但我确定代码存在更多问题。
感谢任何帮助!
答案 0 :(得分:1)
你可能已经解决了,但我认为我为其他人提供了答案。当你拨打这一行时:
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
您说顶点缓冲区中有3个三角形。但实际上有一个三角形。您应该用以下内容替换3:
vertices.length / 3
这样,如果您为更多多边形添加更多点,它将正确渲染它。希望这会有所帮助。
-Brian
PS:我目前正在学习如何在Android上使用opengl。所以我也在弄清楚所有这些小问题。祝你好运:)
答案 1 :(得分:0)
尝试更改此内容:
// Create memory on the heap
ByteBuffer vbb = ByteBuffer.allocateDirect(3 * 3 * 4);
vbb.order(ByteOrder.nativeOrder());
FloatBuffer vertices = vbb.asFloatBuffer();
// Insert points into floatbuffer
vertices.put(floatbuff);
// Reset position
vertices.position(0);
到此:
FloatBuffer vertices = FloatBuffer.wrap(floatbuff);
答案 2 :(得分:0)
它可能不是回答而是建议...... 不要把这个代码放在OnDrawFrame下面,因为你的三角坐标不会改变...在onSurfaceCreated中做这个东西。 使FloatBuffer成为类
的成员变量 // Define the points of my triangle
float floatbuff[] = {
1.0f,0.0f,0.0f,
0.0f,1.0f,0.0f,
-1.0f,0.0f,0.0f
};
// Create memory on the heap
ByteBuffer vbb = ByteBuffer.allocateDirect(3 * 3 * 4);
vbb.order(ByteOrder.nativeOrder());
FloatBuffer vertices = vbb.asFloatBuffer();
// Insert points into floatbuffer
vertices.put(floatbuff);
看一下这堂课TriangleRenderer.java 它会给你基本的