2013-02-09 3 views
0

색인없이 VBO로 전환하려고합니다. 그러나 내가 얻는 것은 단지 빈 스크린이다. 누군가 비어있는 이유를 지적 할 수 있습니까? vbo 관련 코드를 주석 처리하고 VBO를 사용하지 않고 glVertexAttribPointer에서 0 (오프셋)을 mFVertexBuffer로 대체하면 동일한 코드가 제대로 작동합니다. 내 프로그램에 연결하기 전에OpenGL ES 2.0 VBO 문제

// Allocate and handle vertex buffer 
    ByteBuffer vbb2 = ByteBuffer.allocateDirect(mCarVerticesData.length 
      * FLOAT_SIZE_BYTES); 
    vbb2.order(ByteOrder.nativeOrder()); 
    mFVertexBuffer = vbb2.asFloatBuffer(); 
    mFVertexBuffer.put(mCarVerticesData); 
    mFVertexBuffer.position(0); 

    // Allocate and handle vertex buffer 

    this.buffers = new int[1]; 

    GLES20.glGenBuffers(1, buffers, 0); 
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[0]); 
    GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, mFVertexBuffer.capacity() 
      * FLOAT_SIZE_BYTES, mFVertexBuffer, GLES20.GL_STATIC_DRAW); 

:

이이 내 VBO 설정 내 된 onDraw 방법

GLES20.glClearColor(0.50f, 0.50f, 0.50f, 1.0f); 
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); 
// Bind default FBO 
// GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); 
GLES20.glUseProgram(mProgram); 
checkGlError("glUseProgram"); 



GLES20.glEnable(GLES20.GL_BLEND); 
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, id); 
int vertexCount = mCarVerticesData.length/3; 

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[0]); 
checkGlError("1"); 
GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT,false, 0, 0); 
checkGlError("2"); 
GLES20.glEnableVertexAttribArray(positionHandle); 
checkGlError("3 "); 
transferTexturePoints(getTextureHandle()); 
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount); 
checkGlError("glDrawArrays"); 
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); 
GLES20.glDisableVertexAttribArray(positionHandle); 
GLES20.glDisable(GLES20.GL_BLEND); 

입니다

GLES20.glBindAttribLocation(program, 0, "aPosition"); 
checkGlError("bindAttribLoc"); 

을 그리고 내 버텍스 쉐이더는 다음과 같습니다

uniform mat4 uMVPMatrix; 
attribute vec4 aPosition; 
attribute vec2 aTextureCoordinate; 
varying vec2 v_TextureCoordinate; 
void main() 
{ 
    gl_Position = uMVPMatrix * aPosition; 
    v_TextureCoordinate = aTextureCoordinate; 
    gl_PointSize= 10.0; 
} 
,363,210

답변

0

정점 데이터를 업로드하는 방식을 다시 작성하여 문제를 해결했습니다. 나는 그것을 수정하고 있었고 glBindBufferData를 다시 호출하여 업로드 할 필요가있었습니다. 그리고 glDrawElements와 인덱스를 사용하지 않고 VBO를 사용할 수 있었으며 잘 작동합니다.

0

당신은 또한 요소의 배열을 생성하고 "개체"를 렌더링하기 위해이 같은 전화를해야하는 데 도움이

// Bind the vertex buffer 
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, _bufferIds.get(2)); 
GLES20.glVertexAttribPointer(4, 4, GLES20.GL_FLOAT, false, 4*4, 0); 
// Bind the elements buffer and draw it 
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, _bufferIds.get(1)); 
GLES20.glDrawElements(GLES20.GL_TRIANGLES, _numElements, GLES20.GL_UNSIGNED_SHORT, 0); 

희망을.

+0

의견을 보내 주셔서 감사합니다. 그러나 인덱스가있는 glDrawElements에만 해당되는 것이 아닐까요? 편집 : 모든 프레임을 변경할 수있는 많은 점을 그리려하고 있습니다. 그러한 설정에서, 색인은 불필요 할 것입니다. 이제 VBO를 사용하여 '스트림'입력으로 어떻게 작동하는지 확인하려고합니다. – BatCoder

+0

잘못되었습니다. 색인이 필요합니다. 인덱스는 어떤 점을 그려야 하는지를 나타 내기 위해 opengl이 사용하는 것입니다 (귀하의 경우에는 0에서 시작하여 max_points-1에서 끝나는 인덱스의 선형 배열 만 가능). 색인이 없으면 아무 것도 화면에 나타나지 않습니다. – Trax

+0

내 코드에 인덱스를 포함 시키려고했지만 여전히 작동하지 못했습니다. getGLError는 0을 반환하므로 오류가 없습니다. VBO없이 일부 코드를 포함 시키려고하면 비 VBO 객체를 잘 표시합니다. 또한 검색 기능을 사용하면 인덱스가 인덱스 렌더링에만 필요하다는 것을 알 수 있습니다. 인덱스 렌더링에는 정점을 공유하는 객체가 여러 개 없으므로 필요하지 않습니다. 내 응용 프로그램은 주로 점 스프라이트를 표시합니다. – BatCoder