java opengles_java – OpenGLES – 在运行时创建对象

我是OpenGL的新手,从dev.

android.com的小教程开始.示例代码包含方形几何的Square类.该对象将在onSurfaceCreated()方法中创建,并使用onDrawFrame()绘制每一帧.这是Square(构造函数和draw-method)的示例代码:

public Square() {

// initialize vertex byte buffer for shape coordinates

ByteBuffer bb = ByteBuffer.allocateDirect(squareCoords.length * 4);

bb.order(ByteOrder.nativeOrder());

vertexBuffer = bb.asFloatBuffer();

vertexBuffer.put(squareCoords);

vertexBuffer.position(0);

// initialize byte buffer for the draw list

ByteBuffer dlb = ByteBuffer.allocateDirect(drawOrder.length * 2);

dlb.order(ByteOrder.nativeOrder());

drawListBuffer = dlb.asShortBuffer();

drawListBuffer.put(drawOrder);

drawListBuffer.position(0);

// prepare shaders and OpenGL program

int vertexShader = MyGLRenderer.loadShader(

GLES20.GL_VERTEX_SHADER,

vertexShaderCode);

int fragmentShader = MyGLRenderer.loadShader(

GLES20.GL_FRAGMENT_SHADER,

fragmentShaderCode);

mProgram = GLES20.glCreateProgram(); // create empty OpenGL Program

GLES20.glAttachShader(mProgram, vertexShader); // add the vertex shader to program

GLES20.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program

GLES20.glLinkProgram(mProgram); // create OpenGL program executables

}

public void draw(float[] mvpMatrix) {

// Add program to OpenGL environment

GLES20.glUseProgram(mProgram);

// get handle to vertex shader's vPosition member

mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");

// Enable a handle to the triangle vertices

GLES20.glEnableVertexAttribArray(mPositionHandle);

// Prepare the triangle coordinate data

GLES20.glVertexAttribPointer(

mPositionHandle, COORDS_PER_VERTEX,

GLES20.GL_FLOAT, false,

vertexStride, vertexBuffer);

// get handle to fragment shader's vColor member

mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");

// Set color for drawing the triangle

GLES20.glUniform4fv(mColorHandle, 1, color, 0);

// get handle to shape's transformation matrix

mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");

MyGLRenderer.checkGlError("glGetUniformLocation");

// Apply the projection and view transformation

GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);

MyGLRenderer.checkGlError("glUniformMatrix4fv");

// Draw the square

GLES20.glDrawElements(

GLES20.GL_TRIANGLES, drawOrder.length,

GLES20.GL_UNSIGNED_SHORT, drawListBuffer);

// Disable vertex array

GLES20.glDisableVertexAttribArray(mPositionHandle);

}

我现在的问题是:如何在触摸事件之后创建不在onSurfaceCreated()的对象?

我试图定义一个Square变量但不在onSurfaceCreated()初始化它,然后在绘制之前检查对象是否为null.触摸后我打电话给:

mSquare = new Square();

我知道这不是实现这个的好方法,但我只想尝试它是否有效.我会创建一个drawable元素列表并在onDrawFrame()方法中运行它,从列表对象中调用每个draw().但由于这种方法导致程序崩溃,我不知道如何继续.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值