簡體   English   中英

OpenGL在計算着色器中混合GL_TEXTURE_3D的顏色

[英]OpenGL mixes colors for GL_TEXTURE_3D in compute shader

我不確定這是否是驅動程序錯誤,但會發生以下情況:

compute-shader.glsl

#version 320 es
precision mediump float;

layout(local_size_x = 16, local_size_y = 8, local_size_z = 1) in;
layout(rgba8ui, binding = 0) writeonly uniform mediump uimage2D image;
layout(binding = 1) uniform mediump usampler3D grid;

void main() {
    uint i = gl_GlobalInvocationID.y;
    uint j = gl_GlobalInvocationID.x;

    uvec4 val = texture(grid, vec3(float(i)/480.0,float(j)/640.0,0.5));

    imageStore(image, ivec2(j,i), val);
}

val的顏色通道已完全混亂:

  • 阿爾法 = 藍色
  • 紅色=紅色
  • 綠色 = Alpha
  • 藍色 = 綠色

main.cpp

    glActiveTexture(GL_TEXTURE1);
    glEnable(GL_TEXTURE_3D);
    glBindTexture(GL_TEXTURE_3D, grid_tex_id);
    glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 256, 256, 256);
    glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 256, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, grid.data);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

有什么合理的解釋嗎? 注意:我不想使用hack val.ragb (如果存在的話)。

 layout(binding = 1) uniform mediump usampler3D grid; ... glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 256, 256, 256); 

GL_RGBA8不是整數格式; 這是一種規范化的格式。 這意味着它等效於浮點格式。 因此,您應該使用sampler3D而不是usampler3D 或者,您應該使用GL_RGBA_INTEGER像素傳輸格式將數據上傳為GL_RGBA8UI這樣的整數格式。

您可以通過在着色器本身中重新指定格式來使用“圖像加載/存儲”來解決 您不能使用紋理來做到這一點。

暫無
暫無

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

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