Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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
在OpenGL中清除双精度缓冲区_Opengl_Glsl - Fatal编程技术网

在OpenGL中清除双精度缓冲区

在OpenGL中清除双精度缓冲区,opengl,glsl,Opengl,Glsl,有没有一种快速的方法可以用双精度数据类型清除OpenGL缓冲区,或者用API调用设置默认值以避免使用计算着色器 对于半精度和单精度类型,可以使用glClearBufferData/glClearNamedBufferData,但似乎没有用于64位类型的内部格式枚举,这使得在科学计算应用程序中从单精度数据切换到双精度数据更加麻烦。还是我错过了分机 我正在寻找一个能与OpenGL 4.6配合使用的解决方案,Nvidia特定的扩展很好。说到底,double只是解释64位数据的一种方式。您的目标是将正确

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

对于半精度和单精度类型,可以使用glClearBufferData/glClearNamedBufferData,但似乎没有用于64位类型的内部格式枚举,这使得在科学计算应用程序中从单精度数据切换到双精度数据更加麻烦。还是我错过了分机


我正在寻找一个能与OpenGL 4.6配合使用的解决方案,Nvidia特定的扩展很好。

说到底,double只是解释64位数据的一种方式。您的目标是将正确的64位放入缓冲区

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

考虑到这一点,您所需要做的就是让clearing函数获取一个64位的块,并完全按照您提供的方式复制它。要做到这一点,你必须使用正确的方法

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

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

这样,在C或C++中给定64位双值,将缓冲区清除为双值应该简单:

void clear_buffer_to_double(GLuint buffer, double dbl)
{
  glClearNamedBufferData(buffer, GL_RG32UI, GL_RG_INTEGER, GL_UNSIGNED_INT, &dbl);
}