簡體   English   中英

在OpenGL中使用imageStore寫入圖像

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM