2015-01-19 2 views
1

OpenGL es 2.0에서 안드로이드 용 c/C++ (NDK)를 사용하고 있습니다. GLM 라이브러리를 사용하고 있습니다!glDrawElements는 무언가를 그리지 않습니다

지금까지 glDrawArrays를 사용하여 검정색 배경에 흰색 삼각형을 그릴 수 있지만 glDrawElements를 사용하여 동일한 삼각형을 그릴 때 아무 것도 그려지지 않습니다.

관련 코드 :

float triangleCoords[] = { // in counterclockwise order: 
      0, 5, 5, // top 
      -5, 0, 5, // bottom left 
      5, 0, 5 // bottom right 
    }; 

float color[] = { 1,1,1, 1.0f }; 
GLuint drawOrder[]={0,1,2}; 

glClear(GL_COLOR_BUFFER_BIT); 

glUseProgram(program); 

int positionHandle=glGetAttribLocation(program,"vPosition"); 

int matrixHandle = glGetUniformLocation(program, "uMVPMatrix"); 

glEnableVertexAttribArray(positionHandle); 

glUniformMatrix4fv(matrixHandle,1,GL_FALSE,glm::value_ptr(mvpMatrix)); 

glVertexAttribPointer(positionHandle,3,GL_FLOAT,GL_FALSE,0,triangleCoords); 

int colorHandle =glGetUniformLocation(program, "vColor"); 

glUniform4fv(colorHandle, 1, color); 

//glDrawArrays(GL_TRIANGLES, 0, 3); <== This works 

glDrawElements(GL_TRIANGLES,3,GL_UNSIGNED_INT,drawOrder); <== This does not works 

glDisableVertexAttribArray(positionHandle); 

//swapbuffers and stuff 

쉐이더가

std::string vertexShaderCode = 
     "attribute vec4 vPosition; " 
     "uniform mat4 uMVPMatrix; " 
     "void main() {" 
     " gl_Position = uMVPMatrix*vPosition;" 
     "}"; 

    std::string fragmentShaderCode = 
     "precision mediump float;" 
     "uniform vec4 vColor;" 
     "void main() {" 
     " gl_FragColor = vColor;" 
     "}"; 

답변

2

OpenGLES가 인덱스에 대한 GL_UNSIGNED_INT에 대한 지원을 보장하지 않습니다 매우 기본이다. 사용 GL_UNSIGNED_SHORT :

GLushort drawOrder[]={0,1,2}; 

...

glDrawElements(GL_TRIANGLES,3,GL_UNSIGNED_SHORT,drawOrder); 
+0

잘 했어 선생님, 트릭을했다. 그러나 인덱스의 최대 수를 65k로 제한하여 전화 GPU의 킬러가 될 수 있지만 데스크톱 버전에 비해 ES가 여전히 불리합니다. 호기심을 위해서, 65k를 넘는 색인을 붙이기위한 해결 방법이 있습니까? – Allahjane

+0

큰 메쉬는 제한된 크기의 작은 메쉬로 분할하고 각 메쉬마다 다른 배열을 사용해야합니다. 제한은 프레임 당 렌더링 할 수있는 총 삼각형 수에 영향을주지 않습니다. – samgak

관련 문제