- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个 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());
然后我使用 imageStore 在着色器中写入它(按 LOD 0 的预期工作)。
然后我尝试像这样生成 mipmap 级别:
glDrawArrays(GL_TRIANGLE_STRIP,0,4);
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
glGenerateTextureMipmap(textureID);
但是,这会导致在 glGenerateTextureMipmap()
处生成段错误。
我是不是在内存屏障中遗漏了一点,还是在创建纹理时没有分配足够的内存?我做错了什么?
最佳答案
您以错误的方式使用了 glMemoryBarrier
。你应该给这个函数的位域是你想要使用结果的方式。对于 mipmap 生成,不需要使用内存屏障。
您正在使用 glGenerateTextureMipmap
,但您没有使用 glCreateTextures
。为什么您有时只想使用 DSA。在任何地方使用 DSA 或不使用它(对于 glTextureParameteri、glTextureStorage3D... 也会发生同样的情况)。
您正在使用 glTexImage3D
,请改用 glTextureStorage3D
。它将节省您“无用” vector 的构建
您正在使用非 mipmap 过滤,因此请使用像 GL_NEAREST_MIPMAP_NEAREST
这样的 mipmap 过滤。我不知道这是否是崩溃的原因,但这是第一个想法。
告诉我们当您更正代码时发生了什么 ;)。也许您可以向我们提供 ARB_DEBUG_OUTPUT 的输出,如果它告诉您任何信息的话。
关于崩溃,似乎使用 glTexStorage3D
解决了问题。我没有证据,我可能是错的,但我怀疑这种工作方式:glTexImage3D
不分配内存,而是使用纹理进行分配。 (这就是为什么我更喜欢 Vulkan,因为它是明确的)。
因此,当您在不使用 glGenerateMipmap3D
的情况下执行 glTexImage3D
时,会发生以下情况:
使用 glTexImage3D
:假设我们需要这个尺寸的图像。使用纹理:驱动程序看到不需要 mipmapping,因此它只分配一个驱动程序,尽管有 GL_TEXTURE_MAX_LEVEL。调用 generateMipmap :崩溃,因为驱动程序试图到达尚未分配的其他层
第二种方式,在使用前使用generateMipmap :
glTexImage3D
+ generateMipmap
:我需要一张带有 mipmap 的图像。当您使用它时,驱动程序会发现您确实需要所有层,因此它会分配所需的层。
当您使用 glTextureStorage3D
时,您会明确要求图层,因此当驱动程序进行分配时,它将分配所有内容,而不仅仅是一个
关于c++ - 在 imageStore() 之后为 3D 纹理生成 MipMap 级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51547394/
我有一个未定义数量的显示上下文,每个都将显示一个纹理。当我调用 glGenTextures 时,我会在所有显示上下文中返回相同的名称。这会起作用吗?即使它们具有相同的名称,它们仍会存储和显示不同的纹理
我在 SVG 中看到过:文本填充是图像而不是颜色;我一直想知道使用 CSS3 是否可以实现这样的事情。 我浏览了整个网络,到目前为止只找到了基本上将图像覆盖在文本上的解决方法(请参阅 this ,这对
我是 WebGL 的新手。 :)我知道顶点数据和纹理不应该经常更新,但是当它们确实发生变化时,首选哪个:- 通过调用 gl.deleteBuffer 销毁先前的缓冲区 (static_draw) 并创
我需要将 GL_RGBA32F 作为内部格式,但我在 OpenGL ES 实现中没有得到它。相反,我只得到 GL_FLOAT 作为纹理数据类型。 OES_texture_float 规范没有说明里面的
当我执行某些几何体的渲染时,我可以在控制台中看到此警告: THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter sho
我正在尝试使用阴影贴图实现阴影,因此我需要将场景渲染到单独的帧缓冲区(纹理)。我无法让它正常工作,因此在剥离我的代码库后,我留下了一组相对简单的指令,这些指令应该将场景渲染到纹理,然后简单地渲染纹理。
我在 XNA 中使用带有自定义着色器的标准 .fbx 导入器。当我使用 BasicEffect 时,.fbx 模型被 UV 正确包裹并且纹理正确。但是,当我使用我的自定义效果时,我必须将纹理作为参数加
如果我创建一个 .PNG 1024 x 1024 的纹理并在中间画一个 124 x 124 的圆,它周围是空的,它使用的 RAM 量是否与我画一个 124 x 的圆一样124 x 124 空间上的 1
我试图在 Android 中绘制一个地球仪,为此我使用了 OpenGL。然而,为了让它更容易理解,我将从制作一个简单的 3D 立方体开始。我使用 Blender 创建我的 3D 对象(立方体),并在我
文本本身的背景图像层是否有任何 JS/CSS 解决方案? 示例 最佳答案 检查这个http://lea.verou.me/2012/05/text-masking-the-standards-way/
非功能代码: if sprite.texture == "texture" { (code) } 当 Sprite 具有特定纹理时,我正在尝试访问 Sprite 的纹理以运行代码。目前纹理仅在我的
我正在尝试学习适用于 iOS 的 SceneKit 并超越基本形状。我对纹理的工作原理有点困惑。在示例项目中,平面是一个网格,并对其应用了平面 png 纹理。你如何“告诉”纹理如何包裹到物体上?在 3
基本上, 这有效: var expl1 = new THREE.ImageUtils.loadTexture( 'images/explodes/expl1.png' ); this.material
我正在尝试将各种场景渲染为一组纹理,每个场景都有自己的纹理到应该绘制的位置...... 问题: 创建 512 个 FBO,每个 FBO 绑定(bind)了 512 个纹理,这有多糟糕。只使用一个 FB
我正在使用文本 protobuf 文件进行系统配置。 我遇到的一个问题是序列化的 protobuf 格式不支持注释。 有没有办法解决? 我说的是文本序列化数据格式,而不是方案定义。 这个问题是有人在某
我想将我的 3D 纹理的初始化从 CPU 移到 GPU。作为测试,我编写了一个着色器将所有体素设置为一个常数值,但纹理根本没有修改。我如何使它工作? 计算着色器: #version 430 layou
我可以像这样用 JavFX 制作一个矩形: Rectangle node2 = RectangleBuilder.create() .x(-100) .
我在 iPhone 上遇到了 openGL 问题,我确信一定有一个简单的解决方案! 当我加载纹理并显示它时,我得到了很多我认为所谓的“色带”,其中颜色,特别是渐变上的颜色,似乎会自动“优化”。 只是为
假设我有一个域类 class Profile{ String name byte[] logo } 和一个 Controller : class ImageController {
我正在开发一款使用 SDL 的 2D 游戏。由于某些系统的 CPU 较弱而 GPU 较强,因此除了普通的 SDL/软件之外,我还有一个使用 OpenGL 的渲染器后端。 渲染器界面的简化版本如下所示:
我是一名优秀的程序员,十分优秀!