OpengL ES / Angle:渲染到单通道浮动纹理

时间:2017-04-14 14:54:12

标签: floating-point shader opengl-es-2.0 render-to-texture

我正在尝试使用着色器对大型矩阵/图像执行简单操作。我编写了一些使用常规OpenGL运行的代码,通过渲染到帧缓冲区对象中的单通道浮点纹理,这很好。

我现在需要让它在不同的平台上运行(UWP + Angle,Android,...)所以我试图将代码移植到OpenGL ES 2.0;我可以使用常规RGBA图像,但不能使用浮动图像。

什么有效(输出缓冲区'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);

什么行不通:

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);

我对data_out的期望:

27.0000000  float
22.7840576  float
11.4528332  float
-3.45501971 float
-17.2838974 float
-25.7151508 float
-26.1157665 float
(...)

我得到了什么:

-25.7161427 float
-25.7161427 float
-25.7161427 float
-25.7161427 float
-25.7161427 float
-17.2863979 float
-17.2863979 float
(...)

除了以下讨论之外,我在网上找不到很多类似的问题: 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);
}

按下一个填充了任意值(5.23)的纹理并使用glReadPixels检索显示,我只得到4个字节,alpha被粘贴到0

输入值(每字节字节数)

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

输出值(每字节字节数)

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

1 个答案:

答案 0 :(得分:0)

对于浮点格式支持,您需要扩展名:https://www.khronos.org/registry/OpenGL/extensions/OES/OES_texture_float.txt

对于单渠道渲染格式,您需要扩展名:https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_rg.txt

在8888或4444渲染目标的多个通道上编码浮点数并不是一种不寻常的方法。这里有一个示例和几个链接:http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/