2012-07-15 4 views
0

저는 이렇게 몇 가지 질문을 보았습니다.하지만 지금까지 도움이 된 것은 없습니다. 나는 GLTriangle과 GLRectangle 클래스를 만들었다. 이 두 가지 모양을 아무 문제없이 색칠 할 수 있습니다. 나는 그것들에 텍스처를 구현하려고하는데, 그것을 작동시키고 디버깅하는데 문제가있다.OpenGL ES 2.0 텍스처가 검은 색으로 표시됩니다.

내가 지금까지 가지고있는 것의 관련 코드를 게시하려고합니다. 더 많이보고 싶다면 알려주세요.

편집 : 좋아, 그럼, texcoord 처리기로 실수를 수정 한 후, 나는 여전히 검은 색 사각형을 받고있어. glGetError가보고하는 유일한 시간은 GLES20.glEnable (GLES20.GL_TEXTURE_2D)를 호출 한 후입니다.

GLRectangle 관련 코드 :

@Override 
public void onSurfaceCreated() { 
    ByteBuffer vertexByteBuffer = ByteBuffer.allocateDirect(vertices.length * 4); 
    vertexByteBuffer.order(ByteOrder.nativeOrder()); 
    vertexBuffer = vertexByteBuffer.asFloatBuffer(); 
    vertexBuffer.put(vertices); 
    vertexBuffer.position(0); 

    vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode); 
    fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode); 

    mProgram = createAndLinkProgram(VertexShaderHandle(), FragmentShaderHandle(), new String[] { "uMVPMatrix", "vPosition", "a_TexCoordinate" }); 
    muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); 
    maPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition"); 
    loadTexture(context, imageId); 
    ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2); 
ibb.order(ByteOrder.nativeOrder()); 
indexBuffer = ibb.asShortBuffer(); 
indexBuffer.put(indices); 
indexBuffer.position(0); 

ByteBuffer tbb = ByteBuffer.allocateDirect(texCoords.length * 4); 
tbb.order(ByteOrder.nativeOrder()); 
textureCoordBuffer = tbb.asFloatBuffer(); 
textureCoordBuffer.put(texCoords).position(0); 
} 

그리고 onDrawFrame에서 :

GLES20.glUseProgram(mProgram); 
GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, 12, vertexBuffer); 
GLES20.glEnableVertexAttribArray(maPositionHandle); 
Matrix.multiplyMM(mMVPMatrix, 0, projMatrix, 0, mvMatrix, 0); 
GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0); 
mTextureUniformHandle = GLES20.glGetUniformLocation(mProgram, "u_Texture"); 
     mTextureCoordinateHandle = GLES20.glGetAttribLocation(mProgram, "a_TexCoordinate"); 

GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureDataHandle); 
GLES20.glUniform1i(mTextureUniformHandle, 0); 
GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length, GLES20.GL_UNSIGNED_SHORT, indexBuffer); 

내가 알고있는, 또는 내가 INT 핸들을 가져올 적어도 나는, 비트 맵이로드되고 있음을 확신한다 로드 할 때 반환됩니다 (int가 0이면 런타임 오류가 발생합니다).

나는 그것이 텍스처 좌표와 관련이 있다고 생각합니다.

가 여기 내 텍스 좌표를 위해 내가 가진 무엇 :

int[] textureHandle = new int[1]; 

      GLES20.glGenTextures(1, textureHandle, 0); 

      if (textureHandle[0] != 0) { 
       final BitmapFactory.Options options = new BitmapFactory.Options(); 
       options.inScaled = false; 

       final Bitmap bitmap = BitmapFactory.decodeResource(view.getContext().getResources(), resourceId, options); 



       GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]);     

       GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); 
       GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); 


       GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); 


       bitmap.recycle(); 

      } 

      if (textureHandle[0] == 0) { 
       throw new RuntimeException("Unable to load texture!"); 
      } 
      mTextureDataHandle = textureHandle[0]; 

편집 :

texCoords = new float[] { 
    0, 0, 
    0, 1, 
    1, 1, 
    1, 0 
}; 

그냥 경우가 여기있다, 질감 로더 뭔가 내 쉐이더를 추가 잊으셨습니까 난 그냥 지금 코드를 문자열을 설정 해요 :

setVertexShader( 
       "uniform mat4 uMVPMatrix; \n" + 
       "uniform mat4 MVMatrix;  \n" + 
       "attribute vec4 vPosition; \n" + 
       "attribute vec2 a_TexCoordinate; \n" +     
       "varying vec2 v_TexCoordinate; \n" + 

       "void main() {  \n" + 

       "v_TexCoordinate = a_TexCoordinate; \n" + 
       "gl_Position = uMVPMatrix * vPosition; \n" + 
       "} \n");     

     setFragmentShader("precision mediump float; \n" + 
       "uniform sampler2D u_Texture; \n" +     
       "varying vec2 v_TexCoordinate; \n" + 
       "void main() {    \n" + 
       "gl_FragColor = texture2D(u_Texture, v_TexCoordinate); \n" + 
       "}       \n"); 
+1

if (textureHandle [0]! = 0) {'은 ** 오류가 없는지 확인하는 방법이 아니라'glGetError'를 대신 사용하십시오. –

+0

네 말이 맞아. 나는 그것을했고, 오류 코드 1280 GLES20.glEnable (GLES20.GL_TEXTURE_2D)에 – Ryan

+1

당신은 셰이더를 사용하는 경우 텍스처에 대한 glEnable을 사용하지 마십시오. glEnable (GL_TEXTURE_2D)은 고정 함수 파이프 라인에만 사용되므로 opengles2.0에서 유효한 연산이 아닙니다. 선을 완전히 제거하십시오. – Tim

답변

3
mTextureCoordinateHandle = GLES20.glGetUniformLocation(mProgram, "u_Texture"); 
mTextureUniformHandle = GLES20.glGetAttribLocation(mProgram, "a_TexCoordinate"); 

GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureDataHandle); 

이것은 모두 뒤로입니다. 당신은 texcoord 위치를 얻고 그것을 유니폼으로 설정하고, 균일 한 위치를 얻고 그것을 texcoord로 설정합니다. 게다가 texcoord 속성으로 아무 것도하지 않습니다.

+0

고마워, 내가 그걸 놓친 걸 믿을 수가 없어. – Ryan

+0

또한 texcoord는 createandlinkProgram 메소드에서 바인드됩니다. – Ryan

+0

그럼 문제가 해결 되었습니까? @ Ryan – Tim

1

첫 번째 위치에서만 이미지 데이터를 가져 오지 못할 수 있습니다. 텍스처를 채우기 위해 png/jpeg 파일을 가지고있는 코드를 확인하십시오.

관련 문제