【发布时间】:2013-12-19 00:14:31
【问题描述】:
我正在尝试使用一维纹理将整数数组传递到片段着色器中。虽然代码编译运行了,但是当我在shader中查看纹理值时,它们都是零!
这是我学习了许多教程后的 C++ 代码:
GLuint texture;
glGenTextures(1, &texture);
glActiveTexture(GL_TEXTURE0 + 5); // use the 5th since first 4 may be taken
glBindTexture (GL_TEXTURE_1D, texture);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage1D(GL_TEXTURE_1D, 0, GL_RED_INTEGER, myVec.size(), 0,
GL_RED_INTEGER, GL_INT, &myVec[0]);
GLint textureLoc = glGetUniformLocation( program, "myTexture" );
glUniform1i(textureLoc, 5);
这就是我尝试在着色器中访问纹理的方式:
uniform sampler1D myTexture;
int dat = int(texture1D(myTexture, 0.0).r); // 0.0 is just an example
if (dat == 0) { // always true!
我确信这是我的一些小错误,但我就是想不通。不幸的是,我只能使用 GLSL 1.20,所以这种语法对某些人来说可能已经过时了。
那么为什么着色器中的纹理值总是为零?
编辑:
如果我用浮点数替换 int,我仍然有问题:
std::vector <float> temp;
// fill temp...
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage1D(GL_TEXTURE_1D, 0, GL_R32F, temp.size(), 0, GL_R32F, GL_FLOAT, &temp[0]);
// ...
glUniform1f(textureLoc, 5);
这一次,只是从sampler 读取似乎会弄乱其他纹理..
【问题讨论】:
-
我认为对于 int 格式的纹理提取,结果被标准化为 [0,1] 浮点数。试试
isampler1D采样器 -
@AndonM.Coleman -
isampler1D不会编译,GL_R16I和GL_R32I不会改变任何东西。 -
@AndonM.Coleman - 它似乎也不适用于浮点数 - 我已将代码添加到问题中。再次感谢您的宝贵时间!
-
看我的回答,不要使用浮点纹理。使用常规定点(无符号归一化是技术术语)纹理。所以像
glTexImage1D (GL_TEXTURE_1D, 0, GL_R8, myVec.size (), GL_RED, GL_UNSIGNED_BYTE, &myVec [0]);。如果您需要存储超过 256 个值,则需要调整大小和类型以及 GLSL 着色器。
标签: c++ opengl textures fragment-shader