我目前面临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);
对于
sampler2DArray
和sampler3D
,根据此stackoverflow问题(OpenGL 3D Texture Coordinates),我以以下方式上载了float
制服:prg_texture3D->SetUniform("currentSliceTexCoord", (1.0f + 2.0f * currentSlice) / (2.0f * sequence->images().size()));
我很困惑为什么程序使用
isampler2DArray
而不是其他两个运行。您能否告诉我它们之间的区别,尤其是isampler2DArray
和sampler2DArray
之间的区别? 最佳答案
GL_R16I, GL_RED_INTEGER
如果使用非整数采样器,则纹理的image format必须为match that。它必须是浮点数或标准化整数格式。并且
GL_R16I
是整数格式,而不是浮点/规范化格式。关于c++ - OpenGL:isampler2DArray与sampler2DArray与sampler3DArray,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39729667/