所以,我在与1D纹理挣扎。我想要实现的是将3个浮点值作为uniform
传递给片段着色器。它们代表了一种浅色,试图为n
灯重复使用相同的着色器,并将所有信息 - 颜色和位置 - 存储在纹理中。就目前而言,我试图仅通过一盏灯的颜色来测试。所以在片段着色器中我有这个:
uniform sampler1D lightColor;
...
vec3 lc = vec3(texelFetch(lightColor, 0, 0)); // all zeroes
vec3 lc = vec3(texture(lightColor, 0, 0)); // same
我已经尝试在着色器(一个或另一个)中使用texelFetch
和texture
调用来实现它,在这两种情况下都无济于事。请注意,如果我在着色器中硬编码这样的值:
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
,宽度为三倍,大小为xoffset
,GLfloat
作为格式,GL_RGB
作为GLfloat
。最后,实际数据。
关于c ++代码的一些事情:我正确地将过滤器设置为type
(因此不应该责备)我会说sader的统一位置/连接是正确的(通过{ {1}}和GL_NEAREST
)。
所以这是我的问题:
glUniform1i
这样的东西,因为glGetUniformLocation
需要在编译时知道,所以纹理自然会被想到作为一种方法来解决这个问题。lights[n]
,n
和internalFormat
?format
一直用零填充?谢谢!
编辑:我不想使用多次传递等技术,或者对传递给着色器的灯光数量定义硬限制(使type
不变)。我也读过OpenGL 4.2中的一些功能,我相信,这对我也不感兴趣。我只是想用手头的工具学习(但未来我会100%保证,一旦我弄明白这一点,我会回来询问这些话题(:)
答案 0 :(得分:0)
好的,与https://stackoverflow.com/users/1774414/raistmaj
一起计算出来结果width
在glTexStorage
和glTexSubImage
中都是数组中元素的数量,所以1,无论组件数量如何。
此外,必须在glActiveTexture
(duh !!)
glBindTexture