我正在尝试将无符号整数的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)进行比较。
答案 0 :(得分:1)
可能与崩溃无关,但“R8UI”中的“R”表示红色,因此在着色器中应该替换
uint inside2 = texture1D(insideVector, indexInVector).a;
与
uint inside2 = texture1D(insideVector, indexInVector).r;
另外,glTexImage1D调用似乎错了:格式参数应为GL_RED_INTEGER; GL_R8UI用于内部格式。