Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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++ 在imageStore()之后为3D纹理生成MipMap级别_C++_Opengl_Segmentation Fault_Textures_Mipmaps - Fatal编程技术网

C++ 在imageStore()之后为3D纹理生成MipMap级别

C++ 在imageStore()之后为3D纹理生成MipMap级别,c++,opengl,segmentation-fault,textures,mipmaps,C++,Opengl,Segmentation Fault,Textures,Mipmaps,我想创建一个3D纹理,将最低(级别0)的mipmap级别设置为在着色器中生成的某些数据,然后自动填充其余的mipmap级别 我按如下方式创建纹理: //Initialize texture dimensions width = w; height = h; depth = d; //set the texture rendering target, always GL_TEXTURE3D for 3D images target = GL_TEXTURE_3D; //Create the tex

我想创建一个3D纹理,将最低(级别0)的mipmap级别设置为在着色器中生成的某些数据,然后自动填充其余的mipmap级别

我按如下方式创建纹理:

//Initialize texture dimensions
width = w;
height = h;
depth = d;
//set the texture rendering target, always GL_TEXTURE3D for 3D images
target = GL_TEXTURE_3D;
//Create the texture
glGenTextures(1, &textureID);
glBindTexture(target, textureID);
glObjectLabel(GL_TEXTURE, textureID, -1, "\"3D Texture\"");
//Set the texture sampling parameters
glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glTexParameteri(target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER);
glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
//Allocate VRAM storage for the texture
vector<GLbyte> empty = vector<GLbyte>(width*height*depth*(32));
glTexImage3D(target, 0, GL_RGBA8, width, height, depth, 0,
    GL_RGBA, GL_FLOAT, empty.data());
但是,这会导致在
glGenerateTextureMipmap()
处生成分段错误


在创建纹理时,我是否缺少了一点内存障碍,或者没有分配足够的内存?我做错了什么?

您以错误的方式使用了
glMemoryBarrier
。您应该为该函数指定的位字段是您希望使用结果的方式。对于mipmap生成,不需要使用内存屏障

您正在使用
glGenerateTextureMipmap
,但未使用
glCreateTextures
。为什么您只希望有时使用DSA。在任何地方使用DSA或不使用DSA(glTextureParameteri、GLTextureStoreRage3D…)也会发生同样的情况

您使用的是
glTexImage3D
,请改用
glTextureStorage3D
。它将为您节省构建“无用”向量的时间

您正在使用非mipmap筛选,因此请使用mipmap筛选,如
GL\u NEAREST\u mipmap\u NEAREST
。我不知道这是否是坠机的原因,但这是第一个想法

告诉我们更正代码时会发生什么;)。 如果ARB_DEBUG_输出告诉你什么,也许你可以给我们它的输出


关于崩溃,似乎使用
glTexStorage3D
解决了问题。我没有证据,我可能是错的,但我怀疑这种工作:
glTexImage3D
不分配内存,而是使用纹理进行分配。(这就是为什么我更喜欢Vulkan,因为它是明确的)

因此,当您在不使用
glGenerateMipmap3D
的情况下执行
glTexImage3D
时,会发生以下情况:

使用
glTexImage3D
:假设我们需要此大小的图像。使用“纹理:驱动程序”可以看到不需要mipmapping,因此它只分配一个驱动程序,而不考虑GL_texture_MAX_级别。调用generateMipmap:崩溃,因为驱动程序试图访问尚未分配的其他层

第二种方式,在使用前使用generateMipmap:

glTexImage3D
+
generateMipmap
:我需要一张大小与mipmap相同的图像。当您使用它时,驱动程序会看到您确实需要所有层,因此它会分配所需的层


当您使用
glTextureStorage3D
时,您明确要求层,因此当驱动程序进行分配时,它将分配所有层,而不仅仅是一层
sizeof(GLfloat)
vector
构造函数中是怎么回事?如果您想要字节,它不应该是一个
向量吗
?您是正确的,这是我的错误,我已经更改了它,并验证它与当前版本兼容。它应该是8*4(每个组件8字节的组件数量),我搞砸了,谢谢你的注意。分段错误itslef没有消失,但是您是否确定您有
glGenerateTextureMipmap()
?这是一个4.5的函数。检查该函数指针是否实际不为NULL。@derhass我正在运行OpenGL 4.6(至少glGetString()报告了这一点)。此外,我在另一节中调用了该函数,但它没有调用;断层。因此,至少它不是空指针。有关内存屏障本身,请参阅。关于这次车祸,我不知道是什么原因造成的。我可以告诉你一些事情。将glGenTextureMipmap放在渲染循环之前,然后再次调用它,解决了分段错误。同样,“无用”向量也不是无用的。在NVIDIA卡上,驱动程序会清除分配的内存,但在AMD卡上则不会。我的算法要求纹理初始化为0。所以在AMD卡上,它会断裂。“空”向量基本上确保了与AMD卡的兼容性。此外,如果我通过glGenTextures手动初始化所有内容,我不需要调用glCreateTextures。我认为您的CPU根本不关心纹理的“初始化”。请使用glClearTexImage或等效工具以更有效的方式清除纹理:)引用OpenGL参考glClearTexImage:
如果数据为空,则指针将被忽略,纹理图像的子范围将填充为零。
我认为这是您想要的,而无需构建向量。很抱歉,这是一个打字错误。(对不起,我是故意的)
glDrawArrays(GL_TRIANGLE_STRIP,0,4);
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
glGenerateTextureMipmap(textureID);