我很确定它只是一些按位操作的问题,我只是不完全确定我应该做什么,并且所有搜索都返回"64位对32位".
我正在开发一个应用程序,我想在其中获取单个整数输入(基本上是一种颜色),并使用 WebGL 着色器为具有给定输入的框着色。我最初计划使用轮班和掩码的组合来做到这一点,如下所示:
uniform int u_color;
float rValue = (((u_color) >> 16) & 0xFF) / 255.0;
float gValue = (((u_color) >> 8) & 0xFF) / 255.0;
float bValue = ((u_color) & 0xFF) / 255.0;
gl_FragColor = vec4(rValue, gValue, bValue, 1.0);
Run Code Online (Sandbox Code Playgroud)
所以给定 int 0xFF33CC, red=1.0, green=0.2, blue=0.8
但是,我遇到了一个问题,发现 WebGL 着色器无法执行按位移位。
我想知道如何能够从给定的整数有效地生成正确的 FragColor,如果这可能的话。
编辑:经过一些反复试验,感谢@Jongware,我想出了一个解决方案
uniform int u_color;
float rValue = float(u_color / 256 / 256);
float gValue = float(u_color / 256 - int(rValue * 256.0));
float bValue = float(u_color - int(rValue …Run Code Online (Sandbox Code Playgroud) 我非常希望提出一个简洁的问题,允许一个明确的答案,但我担心有太多的小问题,我不完全理解我需要清理的FBO初始化.我正在编写一个针对OpenGL 4.3和OpenGL ES 3.0的延迟着色器,前者的行为完全符合我的预期,但后者给我的问题我无法确定其来源.
首先,我将描述我对GL 4.2和ES 3.0建立MRT FBO的理解/混淆,并希望有人能够纠正任何误解.
OpenGL ES 3.0规范说它支持"四个或更多渲染目标",但没有提及(我能找到)这些渲染目标的规范.对这些渲染目标的大小有什么安全假设?我可以简单地假设它可以具有RGBA32F(四个32位浮点通道)的内部格式吗?在我看来,这是着色器写入RT的关键假设/知识.常见程序:尝试创建具有特定规格的FBO,然后测试FBO完整性?如果失败:减少要求并使用替代着色器来补偿减小的位深度?
精密预选赛是说"用OpenGL ES援助代码的可移植性,与常规的OpenGL没有影响",但我觉得很难理解究竟这些是什么highp,mediump,lowp,用于,以及他们如何与的位深度一起玩渲染目标.首先,我认为的渲染目标位深度确定,并在FBO配置,而且精度预选赛自动匹配这一点,这让我觉得high,medium和low具有某种关系的32,16,8深度位.我已经看过了OpenGL ES 3.0 specs,对此并不是很清楚.
使用glTexStorage2D(with target=GL_TEXTURE_2D,levels=1)配置FBO的纹理附件,我认为这里使用的更正确glTexImage2D,因为只有internalformat应该重要.
然后COLOR_ATTACHMENT使用将附加的(3.)配置纹理附加到FBO glFramebufferTexture2D.
packHalf2x16/ unpackHalf2x16):假设我使用两个颜色附件设置FBO,第一个(RT1)使用内部格式,GL_RGBA32UI第二个(RT2)使用GL_RGBA32F.对象以两遍传递.第一个是FBO RT,然后是两个由默认帧缓冲区处理的全屏四边形.
为了简化,我将只关注在两个阶段之间传递RGB颜色数据.我试图以三种不同的方式这样做:
[适用于GL&ES]使用RT2,将颜色数据定期存储为浮动,将其作为浮动纹理读取并将其输出到默认帧缓冲区.
[适用于GL&ES]使用 …
这个问题与这里的问题非常相关(如何将vec4 rgba值转换为浮点数?).
已经有一些与此问题相关的文章或问题,但我想知道大多数文章都没有确定哪种类型的浮动值.只要我能想到,下面有一些浮动值包装/拆包公式.
然而,实际上这只是两个案例.其他包装/拆包可以通过这两种方法处理.
我想将已签名的浮动值打包并解压缩到vec3或vec2中.
对于我的情况,浮动值不能确保标准化,所以我不能使用简单的位移方式.