簡體   English   中英

OpenGL Compute Shader:寫入紋理似乎什么也沒做

[英]OpenGL Compute Shader: Writing to texture seemingly does nothing

我在網上發現了一些類似的問題,看起來我已經在按照解決方案的建議進行操作了。

總結問題; 盡管計算着色器正在運行並且沒有出現錯誤,但它應該寫入的紋理沒有發生任何變化。

計算着色器代碼。 它原本打算做其他事情,但為了排除故障,它只是用一個填充輸出紋理。

#version 430 core

layout(local_size_x = 4 local_size_y = 4, local_size_z = 4) in;

layout(r32f) uniform readonly  image3D inputDensityField;
layout(r32f) uniform writeonly image3D outputDensityField;

uniform vec4  paintColor;
uniform vec3  paintPoint;
uniform float paintRadius;
uniform float paintDensity;

void main()
{
    ivec3 cellIndex = ivec3(gl_GlobalInvocationID);
    imageStore(outputDensityField, cellIndex, vec4(1.0, 1.0, 1.0, 1.0));
}

我像這樣將紋理綁定到計算着色器。

s32 uniformID = glGetUniformLocation(programID, name);
u32 bindIndex = 0; // 1 for the other texture.
glUseProgram(programID);
glUniform1i(uniformID, bindIndex);
glUseProgram(0);

調度看起來像這樣。

glUseProgram(programID);

glBindImageTexture(0, inputTexID,  0, GL_FALSE, 0, GL_READ_ONLY,  GL_R32F);
glBindImageTexture(1, outputTexID, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R32F);

glDispatchCompute(groupDim.x, groupDim.y, groupDim.z);
glMemoryBarrier(GL_ALL_BARRIER_BITS);

glUseProgram(0);

通過 RenderDoc 檢查不會發現任何錯誤。 紋理似乎已正確綁定,盡管它們都在 RenderDoc 中顯示為輸出,我認為這是 RenderDoc 部分的錯誤? 最后一個 glDispatchCompute 輸出的紋理將在片段着色器中采樣。

操作順序

列出的圖像

紅色方塊是使用 glTexSubImage3D 制作的測試填充。 再次用於故障排除目的。

我確保我傳遞了正確的紋理格式。

RenderDoc 中的示例

此外,我正在使用 glDebugMessageCallback ,它通常會捕獲所有錯誤,所以我假設創建代碼沒有問題。

抱歉,如果提供的信息有點不連貫。 展示所有內容會寫一個很長的帖子,我不確定哪些部分與展示最相關。

我找到了解決方案! 顯然,在 3D 紋理的情況下,您需要傳遞 GL_TRUE 以在glBindImageTexture分層

https://www.khronos.org/opengl/wiki/Image_Load_Store

圖像綁定可以是分層的也可以是非分層的,這由分層決定。 如果 layered​ 是 GL_TRUE,則紋理​必須是數組紋理(某種類型)、立方體貼圖紋理或 3D 紋理。 如果正在綁定分層圖像,則綁定 level​ 指定的整個 mipmap 級別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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