我正在创建一个应用程序,它将读取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中循环它们吗?
答案 0 :(得分:4)
同样,当我尝试在OpenGL线程之外创建绘图对象时,我得到了同样的错误。解决方案 - >应该在OpenGL线程中创建对象。
答案 1 :(得分:2)
我在处理显示stl文件时遇到了同样的问题。我猜你有同样的问题,当你试图创建新的三角形时,你是在错误的线程。你必须确保你对OpenGL方法的调用是在正确的线程上。我自己对这些东西很新。我基本上只是改变了我的程序来排队我必须添加的STL,然后,在onDraw方法中,我实例化了新的东西。
答案 2 :(得分: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;
}