[英]Writing to an image using imageStore in OpenGL
目前,我正在嘗試使用OpenGL中的imageStore寫入圖像。 但是,使用renderdock作為調試器,運行程序后,我只會發現黑色紋理。
我創建並綁定圖像以寫入如下:
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();
繪制僅設置幾何緩沖區,然后調用glDrawArrays()。
結果是一個黑色網格,我期望有一個青色網格
映像加載/存儲操作在不連貫的內存訪問規則下進行。 這意味着對它們的寫入對於以后的讀取是不可見的,除非您明確地做一些使它們可見的操作。 通常,這是對glMemoryBarrier
的調用。
始終記住, glMemoryBarrier
指定您打算如何訪問寫入的值,而不是您如何寫入它。 在這種情況下,任何一種機制都是相同的: GL_SHADER_IMAGE_ACCESS_BARRIER_BIT
。 該命令必須放置在寫入數據的命令之后和讀取數據的命令之前。
另外,我不能說這個着色器是否具有未定義的行為。 您有多個調用都寫到相同的內存位置。 但是在您的情況下,他們正在書寫相同的價值。 從說明書中的描述還不清楚這是真正的UB還是好的。 如果調用正在寫不同的數據,那肯定是UB,但是我不知道他們寫相同的數據是否存在某種例外。
但是,我會非常猶豫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.