Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Opengl-附加到纹理_C_Opengl_Glsl - Fatal编程技术网

C Opengl-附加到纹理

C Opengl-附加到纹理,c,opengl,glsl,C,Opengl,Glsl,我想创建一个纹理系统,在这里我将添加到纹理,而不是覆盖它。我的纹理具有整数值(32位)。我想要的:例如,我有一个位为100的整数像素,我想加10,这样它就变成110 我当前的实现有两个纹理,一个是上一个纹理,另一个是要写入的纹理。读取先前纹理的值,然后使用新数据重写。有没有更好的方法可以做到这一点,因为使用两种纹理感觉效率很低 根据“附加”的含义,您可以使用添加剂混合: 然后,片段着色器的routput将被添加到颜色缓冲区的当前内容中。如果使用FBO渲染到纹理中,则可以直接添加到此纹理 您应该注

我想创建一个纹理系统,在这里我将添加到纹理,而不是覆盖它。我的纹理具有整数值(32位)。我想要的:例如,我有一个位为100的整数像素,我想加10,这样它就变成110


我当前的实现有两个纹理,一个是上一个纹理,另一个是要写入的纹理。读取先前纹理的值,然后使用新数据重写。有没有更好的方法可以做到这一点,因为使用两种纹理感觉效率很低

根据“附加”的含义,您可以使用添加剂混合:

然后,片段着色器的routput将被添加到颜色缓冲区的当前内容中。如果使用FBO渲染到纹理中,则可以直接添加到此纹理

您应该注意不要创建任何反馈循环,因此片段着色器的结果不应该依赖于渲染到的相同纹理的任何样本

更新

如注释中所述,所述纹理具有
GL\u RED\u INTEGER
格式。不幸的是,混合只应用于浮点颜色缓冲区(包括规范化整数),而从不应用于非规范化整数

然而,还有另一种可能的方法。我前面提到的“反馈循环”的规则在最近的OpenGL中已经放宽。扩展明确允许片段着色器从其写入的同一纹理读取像素:

具体来说,渲染片段的值是未定义的(如果有) 着色器阶段获取texel,并通过片段写入相同的texel 着色器输出,即使读取和写入不在同一绘图中 调用,,除非以下任何例外情况适用

  • 读取和写入是从/到不相交的texel集(在 考虑纹理过滤规则)

  • 每个texel只有一次读写操作,并且读操作是在 写入相同纹理的片段着色器调用(例如,使用 “texelFetch2D(采样器,ivec2(gl_FragCoord.xy),0);”。

  • [……]

此扩展已升级为OpenGL 4.5的核心功能。这是非常新的,在很多平台上都不可用,因此不清楚您是否可以使用它……

“追加”在这里是一个非常糟糕的词语选择;追加意味着增加一些集合,但这只是将texel值相加。两种纹理方法可能很好;您可能可以从图像加载/存储中获得更高的效率,但这是一个相当新的问题,我对它的了解还不够,无法提供帮助。我将我的问题改为考虑到这一点,谢谢您使用位整数完成这项工作?假设我有一个位为100的红色整数,再加上10,它会变成110吗?如果是这样的话,这正是我所需要的。如果颜色缓冲区格式为非标准化整数,则不会应用混合。。。你应该在原来的问题中加入这个要求。您的示例值也没有强烈暗示整数…;)@贾斯:我用另一个建议更新了我的答案。YMMV非常感谢您的努力,derhass:),我也读过有关此功能的文章,但不幸的是我使用的是opengl 2。非常感谢你的邀请help@Jas根据具体需要,您可能能够使用logic ops。例如,如果可以将值限制为2的幂,则可以使用
GL\u或
操作“添加”它们。请参见
glLogicOp()
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_ONE, GL_ONE);