1

我一直在关注教程http://www.learnopengles.com并学习更多如何使用 OpenGL ES,但我很难让球体出现。

我已经在 Blender 中制作了一个测地线球体,并导入了顶点和绘制顺序,但每当我调用球体时,应用程序就会崩溃。

我将包含一个指向我的完整渲染文件的链接,但我也会指出我认为可能存在问题的一些关键问题:

这里是创建缓冲区的地方。我不确定应用程序是否存在我缓冲球体的方式或球体的绘制顺序点的问题。

// Initialize the buffers.
    mCubePositions = ByteBuffer.allocateDirect(cubePositionData.length * mBytesPerFloat)
    .order(ByteOrder.nativeOrder()).asFloatBuffer();                            
    mCubePositions.put(cubePositionData).position(0);

    mSpherePositions = ByteBuffer.allocateDirect(spherePositionData.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
    mSpherePositions.put(spherePositionData).position(0);

    ByteBuffer dlb = ByteBuffer.allocateDirect(sphereDrawOrder.length * 2).order(ByteOrder.nativeOrder());
    drawListBuffer = dlb.asShortBuffer();
    drawListBuffer.put(sphereDrawOrder);
    drawListBuffer.position(0);


    mCubeColors = ByteBuffer.allocateDirect(cubeColorData.length * mBytesPerFloat)
    .order(ByteOrder.nativeOrder()).asFloatBuffer();                            
    mCubeColors.put(cubeColorData).position(0);

    mCubeNormals = ByteBuffer.allocateDirect(cubeNormalData.length * mBytesPerFloat)
    .order(ByteOrder.nativeOrder()).asFloatBuffer();                            
    mCubeNormals.put(cubeNormalData).position(0);

这是绘制球体的类。我没有球体的颜色或法线,所以我只是删除了这些部分。是不是因为这个原因才发飙?

private void drawSphere()
{       
    // Pass in the position information
    mSpherePositions.position(0);       
    GLES20.glVertexAttribPointer(mPositionHandle, mPositionDataSize, GLES20.GL_FLOAT, false,
            0, mSpherePositions);        

    GLES20.glEnableVertexAttribArray(mPositionHandle);        

    // Pass in the color information


    // Pass in the normal information


    // This multiplies the view matrix by the model matrix, and stores the result in the MVP matrix
    // (which currently contains model * view).
    Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);   

    // Pass in the modelview matrix.
    GLES20.glUniformMatrix4fv(mMVMatrixHandle, 1, false, mMVPMatrix, 0);                

    // This multiplies the modelview matrix by the projection matrix, and stores the result in the MVP matrix
    // (which now contains model * view * projection).
    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);

    // Pass in the combined matrix.
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0);

    // Pass in the light position in eye space.        
    GLES20.glUniform3f(mLightPosHandle, mLightPosInEyeSpace[0], mLightPosInEyeSpace[1], mLightPosInEyeSpace[2]);

    // Draw the sphere.
    GLES20.glDrawElements(GLES20.GL_TRIANGLES, sphereDrawOrder.length,
            GLES20.GL_UNSIGNED_SHORT, drawListBuffer);                              
}

每当它崩溃时,它都会告诉我 //Draw the sphere 之后的代码有问题。由于某种原因,它不喜欢 glDrawElements。

这是完整的渲染脚本供参考: http: //pastebin.com/Y1WU27hz

如果您对此有任何见解,我感谢您。

4

0 回答 0