색인없이 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
의견을 보내 주셔서 감사합니다. 그러나 인덱스가있는 glDrawElements에만 해당되는 것이 아닐까요? 편집 : 모든 프레임을 변경할 수있는 많은 점을 그리려하고 있습니다. 그러한 설정에서, 색인은 불필요 할 것입니다. 이제 VBO를 사용하여 '스트림'입력으로 어떻게 작동하는지 확인하려고합니다. – BatCoder
잘못되었습니다. 색인이 필요합니다. 인덱스는 어떤 점을 그려야 하는지를 나타 내기 위해 opengl이 사용하는 것입니다 (귀하의 경우에는 0에서 시작하여 max_points-1에서 끝나는 인덱스의 선형 배열 만 가능). 색인이 없으면 아무 것도 화면에 나타나지 않습니다. – Trax
내 코드에 인덱스를 포함 시키려고했지만 여전히 작동하지 못했습니다. getGLError는 0을 반환하므로 오류가 없습니다. VBO없이 일부 코드를 포함 시키려고하면 비 VBO 객체를 잘 표시합니다. 또한 검색 기능을 사용하면 인덱스가 인덱스 렌더링에만 필요하다는 것을 알 수 있습니다. 인덱스 렌더링에는 정점을 공유하는 객체가 여러 개 없으므로 필요하지 않습니다. 내 응용 프로그램은 주로 점 스프라이트를 표시합니다. – BatCoder