在OpenGL中清除双精度缓冲区

是否有一种快速的方法来清除具有双精度数据类型的OpenGL缓冲区,或者使用API​​调用设置默认值以避免使用计算着色器?

对于半精度和单精度类型,可以使用 glClearBufferData / glClearNamedBufferData ,但似乎没有64位类型的内部格式枚举,这使得从单精度转换为双精度精度数据在科学计算应用中更加繁琐。还是我错过了扩展名?

我正在寻找一种与OpenGL 4.6兼容的解决方案,Nvidia特定的扩展很好。

oxforever 回答:在OpenGL中清除双精度缓冲区

在一天结束时,“双精度”只是解释64位数据的一种方式。您的目标是将 right 64位放入缓冲区。

buffer clearing而言,图像格式和像素传输参数只是对如何解释传递的数据的解释。如果清除操作的内部格式为GL_RG32UI,则缓冲区中的每个“像素”都是64位数据。

鉴于此,您所需要做的就是获取清除功能,以获取一个64位块并完全按照您提供的方式进行复制。为此,您必须使用正确的pixel transfer parameters

请参阅,像素传输操作可以执行数据转换,将传递的data指针转换为与内部格式匹配的指针。你不想要那个您想要直接复制。因此,您的像素传输参数需要与内部格式完全匹配。这很容易。

GL_RG_INTEGER格式表示以红色-绿色顺序存储整数数据的两部分像素。 GL_UNSIGNED_INT的类型意味着每个组成部分都是32位无符号整数。这与GL_RG32UI的内部格式完全匹配,因此复制算法不会弄乱数据的字节。

因此,考虑到C或C ++中的某个64位double值,清除该double的缓冲区应该很简单:

void clear_buffer_to_double(GLuint buffer,double dbl)
{
  glClearNamedBufferData(buffer,GL_RG32UI,GL_RG_INTEGER,GL_UNSIGNED_INT,&dbl);
}
本文链接:https://www.f2er.com/3164737.html

大家都在问