2012-07-17 8 views
3

나는 안드로이드 용 Rajawali 라이브러리를 사용하여 장면에 몇 가지 기본 3D 객체를 그리는 중입니다. 하나의 셰이더로 매우 많은 양의 정점을 매우 "저렴하게"렌더링하는 방법을 보여주는 샘플 2000 플레인이 있습니다. 꼭지점 배열을 셰이더에 전달하여 그릴 수 있습니다.OpenGL 셰이더 : 각 버텍스를 개별적으로 어떻게 이동합니까?

이 샘플을 업그레이드하고 일부 정점을 서로 독립적으로 이동시키고 싶습니다.

glBufferSubData를 시도했지만 장면에서 아무 것도 바꿀 수 없습니다. 내가 찾은 한 가지 방법은 데이터를 변경하고 버퍼를 다시 만드는 것이지만, 필요한 데이터 만 변경하는 간단한 방법이 있기를 바랍니다.

예를 들어, 나는 단지 이미 생성되고 바인드 된 버퍼에서 일부 위치 만 변경하려고합니다.

버퍼

mGeometry.createBuffer(mPlanePositionsBufferInfo, BufferType.FLOAT_BUFFER, mPlanePositions,  GLES20.GL_ARRAY_BUFFER); 
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); 

세트 위치

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, planePosBufferHandle); 
    GLES20.glEnableVertexAttribArray(maPlanePositionHandle); 
    fix.android.opengl.GLES20.glVertexAttribPointer(maPlanePositionHandle, 3, GLES20.GL_FLOAT, 
      false, 0, 0); 

을 만들 위치

float[] planePositions = new float[numVertices * 3]; 
    .... 

초기화 및 방법은 예를 들어 위치, 최초면의 제 정점을 수정할 수 있는가? (planePositions [0] = a; planePositions [1] = b; planePositions [1] = c ... 이제이 수정 된 배열을 opengl에 전달해야하지만 어떻게해야할지 모르겠다.

+0

버퍼를 수정하기 전에 잠글 필요가 있습니까? 나는 C++과 함께 Ogre3d를 사용하는 것에 대해서도 매우 익숙하다. 그러나 원칙은 여전히 ​​동일해야한다. 현재 정점 버퍼를 가져 와서 잠그고 수정 한 다음 잠금을 해제 할 수 있어야합니다. 나는 당신이 다른 것을해야한다고 생각하지 않지만 완전히 틀릴 수도 있습니다. 미안하지만별로 도움이 안돼. –

+0

glBufferSubData가 정상적으로 작동해야합니다. 작동하지 않는 항목을 표시 할 수 있습니까? – Tim

답변

3

버퍼 데이터를 수정 한 다음 PlanesGalore 클래스에서 mGeometry.changeBufferData()를 호출하기 만하면됩니다. 내 Renderer 클래스의 onDrawFrame() 이벤트 중에 호출되는 업데이트 메서드에 다음 코드를 추가합니다.

for (int i = 0; i < vertices.length; i += 3) { 
    mPlanePositions= mPlanePositions.put(i, mPlanePositions.get(i) - 0.01f); 
} 

mGeometry.changeBufferData(mCubePositionsBufferInfo, mPlanePositions, 0); 

이것은 이동을 수행하는 데 가장 좋은 방법입니다. 또한 변경된 버퍼 부분을 지정하여 성능을 향상시켜야한다고 명시한 변경 내용을 issue에 제안했습니다.

편집

지금 더욱 그렇게 같은이를 최적화 할 수 있도록 엔진에 내 변경이 승인 된

.

// The offset position should be vertices.length * object #. In my use case this is 72*x 
// allowing me to update the XYZ coordinates of all 24 vertices of a cube. 
int offsetPosition = 0; 
mGeometry.changeBufferData(mCubePositionsBufferInfo, mPlanePositions, offsetPosition, offsetPosition + vertices.length); 
+0

추가 최적화를 보여주기 위해 업데이트되었습니다. –

관련 문제