1

我正在创建一个应用程序,它将读取 stl 文件并使用 OpenGL ES 2.0 显示它们。我已经成功地显示了在 onSurfaceCreated() 方法中硬编码并添加到我的三角形列表中的三角形。我遇到的问题是当我尝试从 stl 文件填充我的三角形对象列表并绘制它们时。尽我所能,顶点的坐标都是有效的并且格式正确。我总是收到主题错误。我在调试这个问题时遇到了麻烦,不知道该怎么做。下面是我的三角形类中出现问题的一段代码。具体来说,错误在代码行上

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


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 facet 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 facet
    GLES20.glUniform4fv(mColorHandle, 1, color, 0);

    // get handle to shape's transformation matrix
    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
    MyRenderer.checkGlError("glGetUniformLocation");

    // Apply the projection and view transformation
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
    MyRenderer.checkGlError("glUniformMatrix4fv");

    // Draw the facet
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
    //If edge mode
    //GLES20.glUniform4fv(mColorHandle, 1, edgeColor, 0);
    //GLES20.glLineWidth(2.0f);
    //GLES20.glDrawArrays(GLES20.GL_LINE_STRIP, 0, vertexCount);

    // Disable vertex array
    GLES20.glDisableVertexAttribArray(mPositionHandle);
}

关于如何调试这种情况的任何想法?另外,对于在程序执行期间添加/删除要绘制的对象的最佳方法,我有些不清楚。我保留对象列表并在 onDraw 中循环遍历它们的想法好吗?

4

3 回答 3

6

同样在这里,当我尝试在 OpenGL 线程之外创建我的绘图对象时,我得到了同样的错误。解决方案 -> 对象应该在 OpenGL 线程中创建。

于 2013-08-29T09:16:53.707 回答
2

我在显示 stl 文件时遇到了完全相同的问题。我猜您遇到了与我相同的问题,即当您尝试创建新三角形时,您的线程错误。您必须确保对 OpenGL 方法的调用在正确的线程上。我自己对这些东西很陌生。我基本上只是改变了我的程序来排队我必须添加的 STL,然后,在 onDraw 方法中,我实例化了新的东西。

于 2013-02-13T02:53:37.337 回答
0

就我而言,我忘记了初始化着色器。加载顶点和片段着色器解决了这个问题。

int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);

和:

public static int loadShader(int type, String shaderCode){
    // create a vertex shader type (GLES20.GL_VERTEX_SHADER)
    // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)
    int shader = GLES20.glCreateShader(type);

    // add the source code to the shader and compile it
    GLES20.glShaderSource(shader, shaderCode);
    GLES20.glCompileShader(shader);
    return shader;
}
于 2014-03-11T01:12:01.233 回答