[英]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 制作的測試填充。 再次用於故障排除目的。
我確保我傳遞了正確的紋理格式。
此外,我正在使用 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.