OpenGLES-在运行时创建对象

用户名

我是OpenGL的新手,从dev.android.com的小教程开始。示例代码包括Square用于正方形几何的此类该对象将在onSurfaceCreated()方法中创建,并使用绘制每一帧onDrawFrame()这是Square(构造函数和绘制方法)的示例代码

   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();

我知道这不是实现此目标的好方法,但我只是想尝试一下是否可行。我会创建一个可绘制元素的列表,并在onDrawFrame()方法中运行它,并draw()从列表对象中调用每个元素但是由于此方法会导致程序崩溃,所以我不知道如何继续。

山姆

您只能在OpenGL上下文中调用OpenGL。

存在此上下文的3种方法:

1)onSurfaceCreated-创建/重新创建上下文时-您应在此处加载资源

2)onSurfaceChanged-创建后并调整表面大小-您应在此处分配与尺寸有关的变量

3)onDrawFrame-在这里执行渲染-在这里您应该执行所有绘图命令

如果您尝试在上下文之外执行OpenGL调用,则很可能代码将无法正确执行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在运行时创建Command对象

来自分类Dev

在运行时创建对象?

来自分类Dev

在运行时创建DEEP不可变对象

来自分类Dev

在运行时过程性地创建和命名对象

来自分类Dev

Android-使用Dagger在运行时创建对象

来自分类Dev

在运行时创建对象并使用它们

来自分类Dev

在运行时创建的对象上的双击事件-Delphi

来自分类Dev

在运行时无法投射对象

来自分类Dev

使对象在运行时不可变

来自分类Dev

在运行时更改注入的对象

来自分类Dev

在运行时替换QWidget对象

来自分类Dev

在运行时添加对象?

来自分类Dev

使对象在运行时不可访问

来自分类Dev

在运行时创建的访问控制

来自分类Dev

DevExpress WebChartControl在运行时创建

来自分类Dev

在运行时快速创建函数

来自分类Dev

在运行时动态创建类

来自分类Dev

在运行时创建Tasklet

来自分类Dev

在运行时创建字段

来自分类Dev

在运行时创建Spock测试

来自分类Dev

django在运行时创建信号

来自分类Dev

在运行时创建UI元素

来自分类Dev

在运行时创建并填充 ImageList

来自分类Dev

Javascript:在运行时创建函数

来自分类Dev

选择在运行时创建的组件

来自分类Dev

在运行时创建字典

来自分类Dev

渲染多个对象时,iOS OpenGLES的异常行为

来自分类常见问题

如何在运行时使用LambdaMetaFactory创建代理对象?

来自分类Dev

在运行时从Scala源代码创建可序列化的对象