读写整数1
我要:
这是我到目前为止:
我创建这样的纹理:
glTexImage2D(GL_TEXTURE_2D,0,GL_R8,width,height,0,GL_RED,GL_INT,(java.nio.ByteBuffer)null);
我也尝试了GL_R8I和GL_RED_INTEGER,但那不行。
我将这个纹理绑定为我的FBO,将blendfunc设置为(GL_ONE,GL_ONE)(加法),并使用着色器渲染1个四边形:
布局(位置= 2)out浮点值; main {value = 1.0;}
再次,整数不会在这里工作!
接下来,我绑定另一个FBO并使用上面的源代码。 我使用了一个着色器,用以下方式对上述内容进行采样
"if (texture2D(Tshadow, v_sampler_coo).r == 1.0){discard;}" + "n"
问题是,我设法让它以某种方式工作的唯一方式是输出:
out_diffuse = 1.0;
比较:
if (texture2D(Tshadow, v_sampler_coo).r == 1.0){discard;}
任何其他值,即使是两个(2 ^ -2,2 ^ -3等)的幂都不会产生真实的语句,除1.0之外没有其他值。
现在我理想的是能够写一个整数并对该整数进行采样。 但我无法管理。 不管我是否成功地写入和整数,sampler2D只返回标准化的浮点数,对吗? 这是采样颜色附件的唯一方法吗?
更新:
我发现如果我写0.5,那么这项工作:
if (texture2D(Tshadow, v_sampler_coo).r == 0.4980392307){discard;}
格式GL_R8I
实际上是您的用例的正确格式,并且该规范明确列出了格式为可呈现颜色的格式。
layout(location = 2) out float value;
如果您打算存储整数,为什么使用float
输出类型? OpenGL 3.3核心配置文件规范明确规定如下:
片段着色器写入的颜色值可能是浮点型,有符号整型或无符号整型。 如果颜色缓冲区具有带符号或无符号的归一化定点格式,则颜色值被假定为浮点,并分别按公式2.6或2.4所述转换为定点; 否则不应用类型转换。
但是,正如你所说:
现在我理想的是能够写一个整数并对该整数进行采样。
你可以这样做,假设你在着色器中使用正确的整数采样器类型。 你不能做的是使用与整数混合。 引用规范:
只有在颜色缓冲区具有定点或浮点格式时,混合才适用。 如果颜色缓冲区具有整数格式,请继续下一步操作。
因此,如果您需要混合,最好的选择是使用GL_R8
标准化的整数格式,并在着色器中使用浮点输出。
使用更现代化的GL,您可以通过直接在更新纹理的着色器中直接采样之前的值来模拟添加混合。 这样的反馈循环在着色器完全读取它后面要写入的纹素位置的地方是明确定义的,并且在最近的GL版本中允许,但不幸的是在GL3.x中没有。
UPDATE
我发现如果我写0.5,那么这项工作:
if (texture2D(Tshadow, v_sampler_coo).r == 0.4980392307){discard;}
好吧,0.5不能用规范化的整数格式表示(实际上,比特深度并不重要,它永远不会工作)。 在8位的情况下,GL将0.5转换为0.5 * 255 = 127.5。 现在,如果它将轮到127或128,那么它将是实现特定的,所以你最终将得到127.0 / 255.0(你得到)或128.0 / 255.0。
关于舍入规则的注意事项:在GL 3.3规范中,声明了乘法之后的值
然后被转换为具有正好b位的无符号二进制整数值
根本没有舍入,所以127应该总是结果。 但是,在最新版本中,GL 4.5称为
返回两个无符号的二进制整数值中的一个,其正好与b位最接近浮点值r(最好舍入到最接近的位)。
所以实际上,允许任何舍入行为...
作为最后一点:你永远不应该比较花车的平等。
链接地址: http://www.djcxy.com/p/33989.html下一篇: How to pass two textures to opengl shader with qt and qglwidget