我正在尝试使用着色器对大型矩阵/图像执行简单操作。我编写了一些使用常规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
答案 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/