从Fragment Shader中采样无符号整数

时间:2015-01-15 11:09:12

标签: opengl glsles

我正在尝试将无符号整数的1D纹理加载到着色器。纹理的每个元素只能是1或0(我需要这样做),并且该值取决于用户在我的应用程序的UI中所做的选择。我绝对坚持这个显而易见的问题,我无法得到我做错的事。 这是我的OpenGL代码:

glGenTextures(1, &m_inside_texture_id);
vtkgl::ActiveTexture(vtkgl::TEXTURE16); 
glBindTexture(GL_TEXTURE_1D, m_inside_texture_id); 

glTexImage1D(GL_TEXTURE_1D,0,vtkgl::R8UI,insideVector.size(),
        0,vtkgl::R8UI,GL_UNSIGNED_BYTE, &insideVector[0]);
glBindTexture(GL_TEXTURE_1D, m_inside_texture_id);
glTexParameterf( GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameterf( GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameterf( GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, vtkgl::CLAMP_TO_EDGE );

glBindTexture(GL_TEXTURE_1D, 0);

这是我用来获取纹理的GLSL代码:

#version 120
#extension GL_EXT_gpu_shader4 : enable

uniform usampler1D insideVector;

uint inside2 = texture1D(insideVector, indexInVector).a;

if (inside2 == 0)
{
    gl_FragColor = shade(vec4(1.0, 0.0, 0.0, 1.0));
}
else if (inside2 == 1)
{
    gl_FragColor = shade(vec4(0.0, 1.0, 0.0, 1.0));
}

insideVector是GLubytes的向量。 indexInVector是一个规范化的无符号整数,每次用户更改时都会增长(每次:insideVector.push_back(1)或insideVector.push_back(0)和indexInVector = insideVector.size() - (1/255))

它编译,但在尝试使用inside2变量时崩溃。 我使用的OpenGL版本是2.1,有很多扩展。 提前谢谢。

编辑: 统一var insideVector设置如下:

vtkUniformVariables *v;
ivalue = 16;
v->SetUniformi("insideVector", 1, &ivalue);

解决的 问题出在着色器中。 inside2是无符号整数,因此必须与无符号整数(0u和1u)进行比较,而不是与有符号整数(0和1)进行比较。

1 个答案:

答案 0 :(得分:1)

可能与崩溃无关,但“R8UI”中的“R”表示红色,因此在着色器中应该替换

uint inside2 = texture1D(insideVector, indexInVector).a;

uint inside2 = texture1D(insideVector, indexInVector).r;

另外,glTexImage1D调用似乎错了:格式参数应为GL_RED_INTEGER; GL_R8UI用于内部格式。