【问题标题】:OpenGLES - Create objects at runtimeOpenGLES - 在运行时创建对象
【发布时间】:2014-02-10 16:35:56
【问题描述】:

我是 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() 初始化它,然后在绘制它之前检查对象是否为空。触摸后我打电话:

mSquare = new Square();

我知道这不是实现它的好方法,但我只是想试试它是否有效。我会创建一个可绘制元素列表并在onDrawFrame() 方法中运行它,从列表对象中调用每个draw()。但是由于这种方法导致程序崩溃,我不知道该怎么做。

【问题讨论】:

    标签: java android opengl-es opengl-es-2.0


    【解决方案1】:

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

    此上下文存在 3 种方法:

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

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

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

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

    【讨论】:

    • 感谢您的快速回答,那么通过触摸事件更改布尔值是否是一个很好的解决方案,以便 onDrawFrame 方法创建对象?
    • 最好在 onDrawFrame 之前预加载所有要使用的对象。在 onTouchEvent 中,您可能会更改一些参数(例如要显示的对象和位置),在 onDrawFrame 中,您可以使用此参数进行渲染
    【解决方案2】:

    Android 和 GL 上下文不同,它们以自己的方式在不同(管理)线程上运行 所以如果你想在你必须创建对象的触摸上创建一个正方形,你必须像这样在 GLcontext 中这样做

    1. http://pastebin.com/zAav7jpu

    2. 在触摸/或您想要做的地方初始化您的对象

      公共静态 isAddedBody = false; //在touch_class中全局声明 公共无效触摸(int..whateva){ mSquare = new Square(); isAddedBody = true;

      }

    在 render()/或 draw() 循环中

    if (touch_class.isAddedBody){
      mSquare.createBody();
      touch_class.isAdded = false;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多