相关疑难解决方法(0)

如何在两个32位整数中存储64位整数并再次转换回来

我很确定它只是一些按位操作的问题,我只是不完全确定我应该做什么,并且所有搜索都返回"64位对32位".

c++

27
推荐指数
3
解决办法
3万
查看次数

WebGL 着色器中的十六进制到 RGB 值

我正在开发一个应用程序,我想在其中获取单个整数输入(基本上是一种颜色),并使用 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)

html c opengl-es webgl fragment-shader

5
推荐指数
1
解决办法
6327
查看次数

与packHalf2x16/unpackHalf2x16的OpenGL 4和ES 3.0差异

我非常希望提出一个简洁的问题,允许一个明确的答案,但我担心有太多的小问题,我不完全理解我需要清理的FBO初始化.我正在编写一个针对OpenGL 4.3和OpenGL ES 3.0的延迟着色器,前者的行为完全符合我的预期,但后者给我的问题我无法确定其来源.

首先,我将描述我对GL 4.2和ES 3.0建立MRT FBO的理解/混淆,并希望有人能够纠正任何误解.

  1. OpenGL ES 3.0规范说它支持"四个或更多渲染目标",但没有提及(我能找到)这些渲染目标的规范.对这些渲染目标的大小有什么安全假设?我可以简单地假设它可以具有RGBA32F(四个32位浮点通道)的内部格式吗?在我看来,这是着色器写入RT的关键假设/知识.常见程序:尝试创建具有特定规格的FBO,然后测试FBO完整性?如果失败:减少要求并使用替代着色器来补偿减小的位深度?

  2. 精密预选赛是说"用OpenGL ES援助代码的可移植性,与常规的OpenGL没有影响",但我觉得很难理解究竟这些是什么highp,mediump,lowp,用于,以及他们如何与的位深度一起玩渲染目标.首先,我认为的渲染目标位深度确定,并在FBO配置,而且精度预选赛自动匹配这一点,这让我觉得high,mediumlow具有某种关系的32,16,8深度位.我已经看过了OpenGL ES 3.0 specs,对此并不是很清楚.

  3. 使用glTexStorage2D(with target=GL_TEXTURE_2D,levels=1)配置FBO的纹理附件,我认为这里使用的更正确glTexImage2D,因为只有internalformat应该重要.

  4. 然后COLOR_ATTACHMENT使用将附加的(3.)配置纹理附加到FBO glFramebufferTexture2D.


它变得奇怪(packHalf2x16/ unpackHalf2x16):

假设我使用两个颜色附件设置FBO,第一个(RT1)使用内部格式,GL_RGBA32UI第二个(RT2)使用GL_RGBA32F.对象以两遍传递.第一个是FBO RT,然后是两个由默认帧缓冲区处理的全屏四边形.

为了简化,我将只关注在两个阶段之间传递RGB颜色数据.我试图以三种不同的方式这样做:

  1. [适用于GL&ES]使用RT2,将颜色数据定期存储为浮动,将其作为浮动纹理读取并将其输出到默认帧缓冲区.

  2. [适用于GL&ES]使用 …

c++ opengl opengl-es glsl glsles

5
推荐指数
1
解决办法
506
查看次数

如何在float和vec4,vec3,vec2之间进行转换?

这个问题与这里的问题非常相关(如何将vec4 rgba值转换为浮点数?).

已经有一些与此问题相关的文章或问题,但我想知道大多数文章都没有确定哪种类型的浮动值.只要我能想到,下面有一些浮动值包装/拆包公式.

  • 无符号规范化浮点数
  • 签署标准化浮点数
  • 签名远程浮点数(浮点值我可以找到范围限制)
  • 无符号远程浮点数
  • 无符号浮点数
  • 签名浮动

然而,实际上这只是两个案例.其他包装/拆包可以通过这两种方法处理.

  • unsigned ranged float(我可以通过简单的位移来打包/解压缩)
  • 签名浮动

我想将已签名的浮动值打包并解压缩到vec3或vec2中.

对于我的情况,浮动值不能确保标准化,所以我不能使用简单的位移方式.

opengl-es webgl glsles

4
推荐指数
2
解决办法
4622
查看次数

标签 统计

opengl-es ×3

c++ ×2

glsles ×2

webgl ×2

c ×1

fragment-shader ×1

glsl ×1

html ×1

opengl ×1