opengl 1D纹理:填充任意浮点值

时间:2016-12-13 18:26:06

标签: c++ opengl shader texture-mapping lighting

所以,我在与1D纹理挣扎。我想要实现的是将3个浮点值作为uniform传递给片段着色器。它们代表了一种浅色,试图为n灯重复使用相同的着色器,并将所有信息 - 颜色和位置 - 存储在纹理中。就目前而言,我试图仅通过一盏灯的颜色来测试。所以在片段着色器中我有这个:

uniform sampler1D lightColor;
...
vec3 lc = vec3(texelFetch(lightColor, 0, 0)); // all zeroes
vec3 lc = vec3(texture(lightColor, 0, 0));    // same

我已经尝试在着色器(一个或另一个)中使用texelFetchtexture调用来实现它,在这两种情况下都无济于事。请注意,如果我在着色器中硬编码这样的值:

vec3 lc = vec3(0.0f, 0.0f, 0.8f);

然后我得到预期的结果(在lc中是非零值),所以我肯定的是,至少在着色器中,问题可能在{{1}中}或texelFetch来电。

回到C ++版本,代码(在texture初始化时执行一次)如下:

lightManager

这里没有什么特别的想法(虽然肯定是错的)。在浏览OpenGL文档的表6.2之后,GLfloat lightValues[] = { 0.8f, 0.8f, 0.8f }; GLuint lightID; // member, not a local variable. glGenTextures(1, &lightID); glBindTexture(GL_TEXTURE_1D, lightID); glActiveTexture(GL_TEXTURE0 + lightID); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexStorage1D(GL_TEXTURE_1D, 1, GL_RGB32F, 1); glTexSubImage1D(GL_TEXTURE_1D, 0, 0, 3 * sizeof(GLfloat), GL_RGB, GL_FLOAT, lightValues); glUniform1i(glGetUniformLocation(shader->program, "light"), lightID); 我为glTexStorage1D选择了1(没有MipMaps)而levels选择GL_RGB32F(因为我试图传3个花车)。 internalFormat为1,因为只有一个值。这应该照顾分配。

现在,用width向上填充缓冲区,我选择glTexSubImage1D 0(再次,没有MipMaps),0为level,宽度为三倍,大小为xoffsetGLfloat作为格式,GL_RGB作为GLfloat。最后,实际数据。

关于c ++代码的一些事情:我正确地将过滤器设置为type(因此不应该责备)我会说sader的统一位置/连接是正确的(通过{ {1}}和GL_NEAREST)。

所以这是我的问题:

  • 首先,显而易见,这是否有意义,通过纹理传递灯光信息?着色器显然无法像glUniform1i这样的东西,因为glGetUniformLocation需要在编译时知道,所以纹理自然会被想到作为一种方法来解决这个问题。
  • 其次,我的假设是正确的,数据的大小可能是罪魁祸首?我已经读过纹理的完整性,但说实话,它相当简短。然而,1 texel的大小肯定是腥味。
  • 第三,你看到别的错了吗?特别是lights[n]ninternalFormat
  • 第四,任何想法为什么format一直用零填充?

谢谢!

编辑:我不想使用多次传递等技术,或者对传递给着色器的灯光数量定义硬限制(使type不变)。我也读过OpenGL 4.2中的一些功能,我相信,这对我也不感兴趣。我只是想用手头的工具学习(但未来我会100%保证,一旦我弄明白这一点,我会回来询问这些话题(:)

1 个答案:

答案 0 :(得分:0)

好的,与https://stackoverflow.com/users/1774414/raistmaj

一起计算出来

结果widthglTexStorageglTexSubImage中都是数组中元素的数量,所以1,无论组件数量如何。

此外,必须在glActiveTexture(duh !!)

之前调用glBindTexture