2016-09-12 175 views
1

我不知道它是否是一個驅動程序錯誤,但以下情況發生:OpenGL的混合顏色GL_TEXTURE_3D在計算着色器

計算-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顏色通道完全加擾:

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

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); 

對此有任何合理的解釋嗎?注意:我不想使用破解val.ragb(如果存在的話)。

+0

你有任何證據表明'grid.data'是RGBA順序嗎? –

+0

是的,我做了,我用'''uimage3D'''做了同樣的例子,而不是''usampler3D''',它工作得很好。 –

回答

2
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這樣的整數格式。

您可能使用Image Load/Store by re-specifying the format in the shader itself了。你不能用紋理來做到這一點。

+0

只是一點點的反饋。看起來GL_RGBA8UI''''' GL_RGBA_INTEGER''''''' GL_UNSIGNED_BYTE'''不能被過濾。見https://www.khronos.org/opengles/sdk/docs/man3/html/glTexStorage3D.xhtml –