2017-04-14 3 views
0

대형 매트릭스/이미지에서 간단한 작업을 수행하기 위해 셰이더를 사용하려고합니다. 프레임 버퍼 객체의 단일 채널 부동 텍스처로 렌더링하여 정규 OpenGL로 실행되는 코드를 작성했습니다. 이는 잘 작동합니다.OpenGL ES/Angle : 단일 채널 플로트 텍스처로 렌더링

이제는 다른 플랫폼 (UWP + Angle, Android, ...)에서 실행해야하므로 코드를 OpenGL ES 2.0으로 이식하려고합니다. 일반 RGBA 이미지와 함께 사용할 수 있지만 float 이미지는 사용할 수 없습니다.

27.0000000 float 
22.7840576 float 
11.4528332 float 
-3.45501971 float 
-17.2838974 float 
-25.7151508 float 
-26.1157665 float 
(...) 
: 나는 DATA_OUT에 기대

format = GL_RED_EXT; 
type = GL_FLOAT; 
internal_format = GL_RED_EXT; 
glTexImage2D(GL_TEXTURE_2D, 0, internal_format, 
    width, 
    height, 
    0, format, type, 
    Data); 
(...) 
glReadPixels(0, 0, width, height, GL_RED_EXT, GL_FLOAT, data_out); 

을 : 어떤 작품

format = GL_RGBA; 
type = GL_UNSIGNED_BYTE; 
internal_format = GL_RGBA; 
glTexImage2D(GL_TEXTURE_2D, 0, internal_format, 
    width, 
    height, 
    0, format, type, 
    Data 

(...) 
glDrawElements(GL_TRIANGLES, (2) * 3, GL_UNSIGNED_SHORT, 0); 
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data_out); 

무엇을 작동하지 않습니다 (출력 버퍼는 'DATA_OUT'는 렌더링의 결과를 포함)

내가받는 것 :

012 3,

나는 다음과 같은 논의를 제외하고, 온라인으로 많은 유사한 문제를 찾을 수 없습니다 : https://groups.google.com/forum/#!topic/webgl-dev-list/ms21hnWk0tg 를, 그래서이있다 "는 할 수 없습니다"하지만 2012 년

다시 작성되었습니다 결론을 보인다 OpenGL ES 2.0을 사용하여 단일 채널 플로트 텍스처에 렌더링 할 수있는 방법이 없습니까? 왜냐하면 그건 내 프로젝트의 주요한 문제 일거야.

업데이트 - 그래서 나는 아래의 설명에서 언급 한 RGBA 인코딩으로 /에서 플로트를 시도했다.

inline float4 EncodeFloatRGBA(float v) { 
float4 enc = float4(1.0, 255.0, 65025.0, 160581375.0) * v; 
enc = frac(enc); 
enc -= enc.yzww * float4(1.0/255.0,1.0/255.0,1.0/255.0,0.0); 
return enc; 
} 
inline float DecodeFloatRGBA(float4 rgba) { 
return dot(rgba, float4(1.0, 1/255.0, 1/65025.0, 1/160581375.0)); 
} 
void main() 
{ 
float raw_value = DecodeFloatRGBA(texture2D(myTextureSampler, UV)); 
gl_FragColor = EncodeFloatRGBA(raw_value); 
} 

I 4 중 단지 3 바이트를 얻을 임의의 값 (5.23)로 채워진 텍스처 밀고 glReadPixels으로 디스플레이 입수 알파 0

입력 값에 부착되는 (바이트 당 바이트)

[0] 41 ')' unsigned char 
[1] 92 '\\' unsigned char 
[2] 167 '§' unsigned char 
[3] 64 '@' unsigned char 

출력값 부동 소수점 포맷 SU 용 (바이트 당 바이트)

[0] 41 ')' unsigned char 
[1] 92 '\\' unsigned char 
[2] 167 '§' unsigned char 
[3] 0 '\0' unsigned char 

답변

0

https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_rg.txt

그것은 8888 또는 4444 대상을 렌더의 여러 채널을 통해 부동 소수점 숫자를 인코딩 할 수있는 특별한 방법은 없습니다 : 당신이 확장을 필요로 형식을 렌더링 https://www.khronos.org/registry/OpenGL/extensions/OES/OES_texture_float.txt

단일 채널의 경우 : 확장이 필요 DMA 장치. 여기에 예제와 여러 링크가 있습니다. http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/

+0

감사합니다. const'GLubyte * msg = glGetString (GL_EXTENSIONS);'와 같은 명령으로 확장을 검사했는데 목록에 GL_OES_texture_float와 GL_EXT_texture_rg가 있습니다. 내가 이해하는 방식으로, 나는 그러한 텍스처를 처리 할 수는 있지만 렌더하지는 않습니다. float를 RGBA 포맷으로 인코딩/디코딩하는 방법에 대해 살펴 보겠다. – Alx

+0

당신 말이 맞아요. https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_color_buffer_half_float.txt에 GLES 2의 반수를 추가했지만 https://www.khronos.org/를 제외한 풀 플로트는 찾을 수 없습니다. 레지스트리/OpenGL/extensions/EXT/EXT_color_buffer_float.txt에 GLES 3이 필요합니다. – Columbo

+0

그래서 간단한 통과 테스트에서 위에서 언급 한 인코딩/디코딩 기능 (http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/)을 구현했습니다. 알파 채널이 0으로 설정되어 있기 때문에 결과가 소스와 다릅니다. 더 살펴보면, 나는 이것을 발견했다. http://stackoverflow.com/questions/6893302/decode-rgb-value-to-single-float-without-bit-shift-in-glsl comment with "메모를 저장할 수 없다. highp 플로트는 24 비트 길이이므로 일반적으로 사용되는 32 개가 아니기 때문에 알파도 마찬가지입니다 (이런 식으로). 그래서 코드의 첫 번째 버전은 작동하지 않아야합니까? – Alx

관련 문제