当前位置: 首页 > 知识库问答 >
问题:

读写整数1通道纹理opengl

夏英发
2023-03-14

我想:

  1. 创建包含整数的可读写单通道纹理

到目前为止,我得到的是:

>

  • 我创建的纹理如下:

    glTexImage2D(GL_纹理_2D,0,GL_R8,宽度,高度,0,GL_红色,GL_INT,(java.nio.ByteBuffer)null);

    我也试过GL_R8I和GL_RED_INTEGER,但都不行。

    我将这个纹理绑定为我的FBO,将blendfunc设置为(GL_ONE,GL_ONE)(加法),并使用一个着色器渲染一个四边形,该着色器只需执行以下操作:

    布局(位置=2)输出浮点值;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,2^-3等)也不会生成真正的语句,除了1.0之外没有其他值。

    理想情况下,我希望能够写出一个整数并对其进行采样。但我办不到。不管我是否成功写入了And integer,sampler2D只返回标准化的浮点,对吗?这是唯一一种对颜色附件进行采样的方法吗?

    更新:

    我发现如果我写0.5,那么这个作品:

    if (texture2D(Tshadow, v_sampler_coo).r == 0.4980392307){discard;}
    
  • 共有1个答案

    师曦
    2023-03-14

    内部格式GL_R8I实际上是您的用例的正确格式,规范明确地将该格式列为颜色可渲染。

    布局(位置=2)输出浮点值

    如果要存储整数,为什么要使用float输出类型?OpenGL 3.3核心配置文件规范明确规定如下:

    片段着色器写入的颜色值可以是浮点、有符号整数或无符号整数。如果颜色缓冲区具有有符号或无符号规范化定点格式,则颜色值假定为浮点值,并分别按照方程式2.6或2.4所述转换为定点;否则不会应用类型转换。

    然而,正如你所说:

    现在我最理想的是能够编写一个整数并对该整数进行采样。

    可以这样做,前提是在着色器中使用正确的整数采样器类型。你不能用整数混合。引用规范:

    仅当颜色缓冲区采用定点或浮点格式时,混合才适用。如果颜色缓冲区采用整数格式,则继续执行下一个操作。

    因此,如果需要混合,最好的选择是使用GL_R8normalized integer格式,以及着色器中的浮点输出。

    使用更现代的GL,可以通过直接对更新纹理的着色器中的上一个值进行采样来模拟加法混合。在最近的GL版本中,着色器准确读取其稍后要写入的texel位置的这种反馈循环是定义良好的,并且是允许的,但不幸的是,在GL3中没有。十、

    更新

    我发现如果我写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(最好四舍五入到最近)。

    所以实际上,任何舍入行为都是允许的。。。

    最后一点:永远不要比较浮动是否相等。

     类似资料:
    • 所以我有一个非常简单的glsl着色器,可以用纹理和平行光渲染对象。 现在我有一个非常艰难的时间试图得到的纹理显示,其他一切工作,除此之外。 当我禁用着色器(glUseProgram(0))时,纹理以黑色和白色渲染,但当我启用它时,整个网格是单一颜色,没有纹理,当我尝试不同的纹理时,它会改变颜色。 这就是我加载纹理的方式 这就是我如何绑定我的纹理 这是我的顶点着色器 这是我的碎片着色器 最后但并非最

    • 问题内容: 有没有人有一种方法可以在Python中导入每通道16位,3通道TIFF图像? 我还没有找到一种在处理TIFF格式时可以保留每个通道16位深度的方法。我希望一些乐于助人的人能够解决。 这是到目前为止我没有成功尝试过的结果以及结果的列表: 到目前为止,我发现的唯一解决方案是使用ImageMagick将图像转换为PNG。然后,沼泽标准会毫无问题地读取PNG文件。 我遇到的另一个问题是将任何n

    • 好的,所以我需要创建我自己的纹理/图像数据,然后在OpenGL中将它显示到一个四边形上。我让四边形工作,我可以用我自己的纹理加载器在上面显示一个TGA文件,它完美地映射到四边形。 但是我如何创建自己的“自制图像”,即每个像素1000x1000和3个通道(RGB值)?纹理数组的格式是什么,例如如何将像素(100,100)设置为黑色? 这就是我对完全白色的图像/纹理的想象: 编辑:下面的答案是正确的,

    • 译注 注意,由于作者对教程做出了更新,之前本节使用的是SOIL库,但现在改为了使用stb_image.h库,关于SOIL配置的部分现在已经被修改,但我仍决定将这部分教程保留起来,放到一个历史存档中,如果有需要的话可以到这里来查看。 我们已经了解到,我们可以为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像。但是,如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多的颜色。这将会

    • 将图片加载后创建纹理对象,纹理将直接用于绘制 createTextures(object) 纹理异步加载,批量异步加载接口 手Q版本:7.8.0 函数参数object属性: 属性名 类型 是否必填 说明 file Array 是 要加载的图片文件数组 success Function 否 接口调用成功回调 fail Function 否 接口调用失败回调 complete Function 否 接

    • 我正在学习Netty并制作一个通过TCP发送对象的简单应用程序的原型。我的问题是,当我用我的消息从服务器端调用时,它似乎没有到达管道中的处理程序。当我从客户端向服务器发送消息时,它按预期工作。 这是代码。 服务器: 双工通道处理程序: 最后是编码器(解码器类似): 客户端: 和处理程序: 当我通过服务器端的控制台发送消息时,我得到了输出: 因此,看起来似乎在客户端发送了消息,但没有收到任何消息。