2014-09-03 4 views
0

Android에서 OpenGL ES 3.0 응용 프로그램을 주로 Java로 개발 중이며 부동 소수점 렌더링 텍스처를 사용해야합니다.Android에서 OpenGL ES 확장 기능을 사용하는 방법

GLES30.glGetString(GLES30.GL_EXTENSIONS) 

는 => 내 장치가 분명히 소수점 텍스처 부동 지원하는 다른 사람의 사이에서 GL_EXT_color_buffer_half_float 포함 된 문자열을 반환하고, GL_EXT_color_buffer_float.

그러나 지금은 확장자를 사용하는 방법이 약간 분실되어 있습니다. 내가 대신 GL_RGBA16F의 GL_RGBA를 사용할 때 glError 1282. 모든 일에 호출

GLES30.glTexImage2D(GLES30.GL_TEXTURE_2D, 0, GLES30.GL_RGBA16F, 512, 512, 0, GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE, null); 

결과는 작동합니다. GL_RGBA16F_EXT를 사용해보고 싶었지만 GLES30에는 포함되어 있지 않습니다. 그래서, 나는 GL_RGBA16F_EXT가 정의 된 방법 인 0x881A라는 값을 전달하려했다. 그러나 같은 오류 : glError 1282.

OpenGL ES 확장을 사용하기 위해 때때로 필요로하는 함수 eglGetProcAddress가 있습니다. 그러나 함수의 주소가 필요하지 않기 때문에 저도 도움이되지 않습니다. 나는 다음에 무엇을 시도해야할지 정말로 모른다. 부동 소수점 FBO는 어떻게 만들 수 있습니까?

답변

1

GL_UNSIGNED_BYTEinternalFormatGL_RGBA16F 인수의 값과 조합 glTexImage2D()type 인수에 대해 유효한 값이 아니다.

사양의 표 3.2에 따라 GL_RGBA16F의 유효한 값은 GL_HALF_FLOATGL_FLOAT입니다. 이 호출은 작동합니다 :

전체 OpenGL을 달리
GLES30.glTexImage2D(GLES30.GL_TEXTURE_2D, 0, GLES30.GL_RGBA16F, 512, 512, 0, 
        GLES30.GL_RGBA, GLES30.GL_HALF_FLOAT, null); 

, OpenGL을 ES는 glTexImage2D() 유효 format/type/internalFormat 조합의 매우 제한된 세트가 있습니다. 이 호출의 일부로 데이터 형식의 자동 변환을 지원하지 않습니다 (표 3.2 참조).

이러한 typeinternalFormat 값은 호출에 데이터가 지정되지 않은 경우에도 유효한 조합을 형성해야합니다. 주로 ... 그런 식으로 정의 되었기 때문입니다. 개인적 견해로는 전체 glTexImage2D()은 결코 좋은 API 디자인이 아니 었으며 부분적으로는 시간이 지남에 따라 발전했습니다. 더 새로운 glTexStorage2D()은 훨씬 더 깨끗합니다.

예를 들어 GL_RGBA16F은 크기가 지정된 형식이므로 internalFormat은 실제로 텍스처의 저장 형식을 지정합니다. 따라서 type은 중복 된 것처럼 보입니다. 그러나 오래된 호환되지 않는 형식은 이전 버전과의 호환성을 위해 계속 지원됩니다. 당신은 당신이 그 type에 대한 GL_UNSIGNED_BYTE와 결합하는 경우 GL_RGBinternalFormat를 들어, 질감이 GL_RGB8 내부 형식을 사용합니다 지정하지만, typeGL_UNSIGNED_SHORT_5_6_5하는 GL_RGB565 경우가있을 것입니다 말해봐.

+0

아, 네 말이 맞아. 감사! 나는 type 매개 변수가 data 매개 변수와 연관되어 있으므로 data = null이므로 type에 대해 지정하는 것이 중요하지 않을 것이라고 생각했습니다. 분명히, 거기에 뭔가 오해했습니다 - 어떤 효과가 형식 매개 변수가 있습니까? internalFormat이 모든 것을 지정하지 않습니까? GPU는 알아야합니까? – j00hi

+1

시도해보고 내용을 추가했습니다. 그렇다고하더라도 논리적으로 설명하기는 어렵습니다. 이러한 API 중 일부가 정의되는 방식이 완전히 엉망이기 때문입니다. –