Android OpenGL рендеринга мусора - PullRequest
1 голос
/ 20 марта 2012

Я делал несколько простых шейдеров, и я сталкиваюсь с ошибкой, которая происходит случайно, когда я начинаю рендерить свою сцену, иногда сетка отображается с дополнительными векторами, и если я убиваю действие, а затем открываю то же самое действие, оноиногда рендерится без лишних векторов.

Я предполагаю, что память на GPU не полностью стирается, когда я убиваю активность.Что еще более странно, так это то, что эти дополнительные многоугольники визуализируются иногда с использованием моей логики шейдеров, а иногда они отображаются так, как будто они заполнены случайными квадратами.

Я схожу с ума, я просмотрел весь код, откуда яПрочтите obj, где я устанавливаю атрибуты вершины, если вы уже видели это, пожалуйста, дайте мне знать.Кстати, я использую вехой Motorola с Android 2.1.

Это код, где я создаю простой треугольник и устанавливаю атрибуты вершин:

//This is where I create the mesh
mMesh = new Mesh();
mMesh.setVertices(new float[]{-0.5f, 0f, 0.5f, 
                               0.5f, 0f, -0.5f, 
                              -0.5f, 0f, -0.5f});

ArrayList<VertexAttribute> attributes = new ArrayList<VertexAttribute>();
attributes.add(new VertexAttribute(Usage.Position, 3, ProgramShader.POSITION_ATTRIBUTE));

VertexAttributes vertexAttributes = new VertexAttributes(attributes.toArray(new VertexAttribute[attributes.size()]));
mMesh.setVertexAttributes(vertexAttributes);

...
...
.......
//This is where I send the mesh to opengl
for(VertexAttribute attr :mVertexAttributes.getAttributes().values()){
   mVertexBuffer.position(attr.offset);
   int handler = shader.getHandler(attr.alias);
      if(handler != -1){
         try{
            GLES20.glVertexAttribPointer(handler, attr.numComponents, GLES20.GL_FLOAT, false, mVertexAttributes.vertexSize, mVertexBuffer);     
            GLES20.glEnableVertexAttribArray(handler);

         }catch (RuntimeException e) {
            Log.d("CG", attr.alias);
            throw e;
         }
      }
   }

//(length = 3 for a triangle)
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, length);

Вот несколько скриншотовчтобы увидеть проблему:

Также здесь есть ссылка на видео, которое я снял при запуске приложения на телефоне..

1 Ответ

2 голосов
/ 29 марта 2012

Итак ... Я обнаружил, что это была действительно глупая вещь, которую я делал,

//on this line I was sending length, where length was
//the length of the vertices for the triangle it was "9" (x,y,z for each vertex)
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, length);
//I had to divide that by the number of components for each vertex
//so when the vertex only has position attributes (x,y,z) is divided by 3
//when you have more i.e. normals it will be divided by 6 (x,y,z, normalX, normalY, normalZ)
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, length/mVertexAttributes.vertexNumComponents);

Надеюсь, это поможет другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...