- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前我正在尝试使用 OpenGL 中的 imageStore 写入图像。然而,使用 renderdock 作为我的调试器,我在运行我的程序后发现只有一个黑色纹理。
我创建并绑定(bind)要写入的图像,如下所示:
glGenTextures(1, &textureID);
glBindTexture(target, textureID);
glObjectLabel(GL_TEXTURE, textureID, -1, "\"3D Texture\"");
glTexStorage3D(target, 1, GL_RGBA8, width, height, depth);
glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
然后我通过执行以下操作将纹理加载到程序中:
glBindImageTexture(0, textureID, 0, GL_TRUE, 0, GL_READ_WRITE, GL_RGBA8);
GLuint location = glGetUniformLocation(programID, uniform);
glUniform1i(location,0);
最后我通过调用 glDrawArrays() 进行渲染。
我的片段着色器看起来像:
#version 440
out vec3 f_pos;
out vec3 f_norm;
out vec2 f_uv;
layout(RGBA8) uniform image3D volumeMap;
void main()
{
imageStore(volumeMap, ivec3(0,0,0),
vec4(0,1,1,0));
}
所以我的期望是在第一层的左上角找到一个青色像素。然而那个像素是黑色的。
我已经使用 texture() 调用成功加载采样器并从中读取采样器。
我不确定我是否缺少步骤或者我做事的方式是否错误。
编辑:
我修改了我的代码以不依赖 RenderDoc 来检查颜色。
所以我渲染如下
最终片段着色器:
#version 440
out vec4 fragment_color;
layout(binding=3, RGBA8) uniform image3D vMap;
void main()
{
fragment_color = imageLoad(vMap, ivec3(0,0,0));
}
C++
glUseProgram(Program1);
/*load texture as above*/
draw();
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
glUseProgram(Program2);
/*load texture as above*/
draw();
draw 只是设置几何缓冲区,然后调用 glDrawArrays()。
结果是黑色网格,我希望是青色网格
最佳答案
图像加载/存储操作在 incoherent memory access 规则下运行.这意味着对它们的写入对以后的读取不可见,除非您明确地执行某些操作以使它们可见。通常,这是对 glMemoryBarrier
的调用。
永远记住 glMemoryBarrier
指定了您打算如何访问写入的值,而不是您如何写入它。在这种情况下,两种方式的机制都是相同的:GL_SHADER_IMAGE_ACCESS_BARRIER_BIT
。此命令必须放在写入数据的命令之后和读取数据的命令之前。
另外,我不能说这个着色器是否有未定义的行为。您有多个调用都写入同一内存位置。但就您而言,他们写的是相同的值。从说明书上的描述看不清楚这是正品UB还是没问题。如果调用写入不同的数据肯定是 UB,但我不知道它们写入相同数据是否存在某些异常。
不过,我会很犹豫是否要这样做。
关于c++ - 在 OpenGL 中使用 imageStore 写入图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50321736/
在OpenGL中使用imageStore时,是原子的吗? 或者换句话说,假设我有一个计算着色器调用将“82”写入一个位置,另一个调用将“42”写入同一位置。 当我从同一位置读取第三次调用时:我能保证得
在更新旧的 React Native 应用程序时,我遇到了遗留代码的问题。它在一种方法中使用 ImageStore addImageFromBase64() 来: 将Base64图片存入FS 在顶部和
我正在使用 imageStore() 修改纹理的纹素,然后我在其他着色器中读取这些纹素作为带有 texture() 的 sampler2D,但我得到了在 imageStore() 之前存储在纹理中的值
我想在多个计算着色器 中使用imageStore 和imageLoad。 这与屏幕或帧缓冲区的“正常”渲染命令 (glDraw) 混合,但这些不使用 imageStore 或 imageLoad(仅
我有一个迭代调度的计算着色器,并使用 2d 纹理来临时存储值。每个调用 id 访问纹理中的特定行。 问题是,这个纹理必须在每次着色器调度之前初始化为 0。 目前,我在着色器代码末尾使用一个循环,该循环
我知道在同一分派(dispatch)的不同调用中使用 imageStore 并随后使用 imageRead 需要正确读取一致的关键字。 但是,我可以在不使用 coherent 的情况下在同一个 dis
我正在尝试将一些数据从计算着色器输出到纹理,但 imageStore() 似乎什么也没做。这是着色器: #version 430 layout(RGBA32F) uniform image2D ima
目前我正在尝试使用 OpenGL 中的 imageStore 写入图像。然而,使用 renderdock 作为我的调试器,我在运行我的程序后发现只有一个黑色纹理。 我创建并绑定(bind)要写入的图像
我想创建一个 3D 纹理,将最低(级别 0)的 mipmap 级别设置为在着色器中生成的一些数据,然后自动填充其余的 mipmap 级别。 我按如下方式创建纹理: //Initialize textu
我写了一些代码,太长无法粘贴到这里,它通过使用无绑定(bind) imageLoad 和 imageStore 的片段着色器渲染到 3D 1 组件浮点纹理。 该代码绝对有效。 然后我需要解决一些 GL
我是一名优秀的程序员,十分优秀!