我目前面临OpenGL采样器的问题。我有一个正在运行的片段着色器,它使用isampler2DArray变量来采样一堆2D图像和一个整数索引,该索引用于从堆栈中检索所需的切片。

片段着色器如下所示:

#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,根据此stackoverflow问题(OpenGL 3D Texture Coordinates),我以以下方式上载了float制服:

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


我很困惑为什么程序使用isampler2DArray而不是其他两个运行。您能否告诉我它们之间的区别,尤其是isampler2DArraysampler2DArray之间的区别?

最佳答案

GL_R16I, GL_RED_INTEGER



如果使用非整数采样器,则纹理的image format必须为match that。它必须是浮点数或标准化整数格式。并且GL_R16I是整数格式,而不是浮点/规范化格式。

关于c++ - OpenGL:isampler2DArray与sampler2DArray与sampler3DArray,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39729667/

10-09 12:56