簡體   English   中英

OpenGL Compute Shader 渲染到 3D 紋理似乎沒有做任何事情

[英]OpenGL Compute Shader rendering to 3D texture does not seem to do anything

我編寫了一個小的着色器來設置 3D 體積的顏色值。

#version 430

layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
layout (r8, binding = 0) uniform image3D destTex;

void main() 
{
    imageStore(destTex, ivec3(gl_GlobalInvocationID.xyz), vec4(0.33, 0, 1.0, 0.5));
}

它編譯和鏈接沒有錯誤。

創建卷並像這樣調度計算着色器

    generateShader->use();

    glEnable(GL_TEXTURE_3D);
    glGenTextures(1, &densityTex);

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_3D, densityTex);

    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

    glTexImage3D(GL_TEXTURE_3D, 0, GL_R8, chunksize + 1, chunksize + 1, chunksize + 1, 0, GL_RED, GL_UNSIGNED_BYTE, NULL);
    glBindImageTexture(0, densityTex, 0, GL_TRUE, 0, GL_READ_WRITE, GL_R8);

    glDispatchCompute(chunksize + 1, chunksize + 1, chunksize + 1);
    // make sure writing to image has finished before read
    glMemoryBarrier(GL_ALL_BARRIER_BITS);

asdf(0); //Here I print the content of my texture. 
         //Strangely it contains the values 205 everywhere and independent of what I set in the shader: vec4(0.33, 0, 1.0, 0.5)

    glBindTexture(GL_TEXTURE_3D, 0);

打印圖像數據的方法如下所示:

void Chunk::asdf(int slice) {

    GLubyte* image;
    image = new GLubyte[(chunksize + 1) * (chunksize + 1) * (chunksize + 1)];

    glGetTexImage(GL_TEXTURE_3D, 0, GL_R8, GL_UNSIGNED_BYTE, image);
    std::cout << "Reading texels" << std::endl;
    for (int i = 0; i < (chunksize + 1); i++) {
        for (int j = 0; j < (chunksize + 1); j++) {

            int start = (((chunksize + 1) * (chunksize + 1) * slice) + (i * (chunksize + 1)) + j);
            std::cout << "Texel at " << i << " " << j << " " << slice << " has color " << (float)image[start] << std::endl;
        }
    }

    delete[] image;
}

這段代碼有什么問題? 在 GPU 上設置數據后,我是否需要一些特殊的方法來檢索數據? 另外,我不太明白如何在 GPU 中設置該值,因為在使用 imageStore 時,必須設置一個 vec4 值,但紋理僅包含一個紅色通道(如果我使用 RGBA 格式,則沒有區別)

編輯:事實證明我沒有解決問題。 我自己寫了一個着色器來將我的 3D 紋理的內容渲染到屏幕上。 似乎我的打印功能(asdf)沒有得到正確的紋理值,因為如果渲染到屏幕上,顏色值是不同的渲染到屏幕的 1 片紋理

如您所見,它看起來仍然不太正確,但我認為這是另一個問題的主題?

glGetTexImage(GL_TEXTURE_3D, 0, GL_R8, GL_UNSIGNED_BYTE, image);

這不會將任何數據復制到image ,而只會生成GL_INVALID_ENUM錯誤。 GL_R8只是不是一個有效的format參數。 您很可能在這里指的是GL_RED (請注意,這與您用於glTexImage3Dformat參數GL_R8只是internalFormat的枚舉,它永遠不會與您在 OpenGL 客戶端看到的任何內容相關,另請參閱此問題)。

作為更一般的建議,我真的建議大家在開發過程中使用OpenGL 的調試輸出功能,這樣就不會忽視 OpenGL 錯誤。

暫無
暫無

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

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