2016-09-27 483 views
0

我目前面临着OpenGL采样器的一个问题。我有一个正在运行的片段着色器,它使用isampler2DArray变量来采样一堆二维图像以及一个用于从堆栈中检索所需片的整数索引。OpenGL:isampler2DArray与sampler2DArray与sampler3DArray

片段着色器看起来是这样的:

#version 430 

/* Per Fragment Input Attributes */ 
in vec2 texCoord; 

/* Per Fragment Uniform Attributes */ 
layout (binding = 0) uniform isampler2DArray textureSampler; 

/* Per Fragment Output Values */ 
layout (location = 0) out vec3 out_color; 

uniform float windowCenter; 
uniform float windowWidth; 

uniform int texIndex; 

void main() 
{ 
    float value = float(texture(textureSampler, vec3(texCoord, texIndex)).r); 

    float min = windowCenter - windowWidth/2; 

    value = (value - min)/windowWidth; 

    out_color = vec3(value); 
} 

当我试图改变采样器sampler2DArray和统一变量来检索数据float,我只得到一个黑色的屏幕,而不是抽样的质感。类似于sampler3D

纹理设置代码如下:

m_texture= std::make_unique<Texture>(GL_TEXTURE_2D_ARRAY, nullptr, sequence->width(), sequence->height(), sequence->images().size(), GL_R16I, GL_RED_INTEGER, 1, 0, GL_SHORT); 

glPixelStorei(GL_UNPACK_ROW_LENGTH, sequence->width()); 

for (int i = 0; i < sequence->images().size(); i++) 
{ 
    m_texture->UpdateTexture(sequence->images()[i]->data(), 0, sequence->images()[i]->width(), 0, sequence->images()[i]->height(), i, 1); 
} 

glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); 

sampler2DArraysampler3D,我上传了我的float一致通过以下方式,根据该计算器问题(OpenGL 3D Texture Coordinates):

prg_texture3D->SetUniform("currentSliceTexCoord", (1.0f + 2.0f * currentSlice)/(2.0f * sequence->images().size())); 

我我不明白为什么程序运行在isampler2DArray而不是其他两个。你能否告诉我他们之间的区别,尤其是isampler2DArraysampler2DArray之间的区别?

+0

纹理类从哪里来?您是否正确设置了浮点纹理的最小/最大值滤镜? – BDL

+0

这是我自己创建的一个自定义的。这两个值都设置为“GL_LINEAR”。 – Schnigges

回答

1
GL_R16I, GL_RED_INTEGER 

如果使用非整数采样器,那么你的纹理的image format必须match that。它必须是浮点或标准化的整数格式。而GL_R16I是一种整数格式,而不是浮点/标准化格式。

+0

好吧,我的数据是12位DICOM数据,有没有办法在着色器中将其转换为“float”? – Schnigges

+0

@Schnigges:你当前的方法将其转换为“float”会出现什么问题? –