gpt4 book ai didi

c++ - opengl 1D 纹理 : fill with arbitrary float values

转载 作者:太空宇宙 更新时间:2023-11-04 13:08:20 25 4
gpt4 key购买 nike

所以,我正在为 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 中是非零值),所以我很肯定,至少在着色器中,问题可能出在 texelFetch 中。或 texture电话。

回到 C++ 领域,代码(在我的 lightManager 初始化时执行一次)如下:

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);

这里没什么特别的(尽管肯定是错误的)。在查看 OpenGL 文档的表 6.2 之后,glTexStorage1D我为 levels 选择了 1 (无 MipMap)和 GL_RGB32F对于 internalFormat (因为我试图传递 3 个花车)。 width是 1,因为只有一个值。那应该负责分配。

现在,开始用 glTexSubImage1D 填充缓冲区,为此我选择 level 0(同样,没有 MipMap),0 表示 xoffset , 宽度是 GLfloat 的三倍, GL_RGB作为格式和 GLfloat作为 type .最后是实际数据。

关于 C++ 代码的一些事情:我正确地将过滤器设置为 GL_NEAREST (所以这不是罪魁祸首)我会说到 sader 的统一位置/连接是正确的(通过 glUniform1iglGetUniformLocation )。

所以我的问题来了:

  • 首先很明显,通过纹理传递灯光信息是否有意义?着色器显然无法执行类似 lights[n] 的操作, 自 n需要在编译时知道,因此纹理自然而然地被认为是一种欺骗它的方法。
  • 其次,我关于数据大小可能是罪魁祸首的假设是否正确?我读过有关纹理完整性的内容,但老实说,它相当简短。不过,1 texel 的大小肯定有鱼腥味。
  • 第三,你还有什么不对的地方吗?特别是 internalFormat , formattype
  • 第四,任何想法一般为什么lc一直填充零?

谢谢!!

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

最佳答案

好的,和https://stackoverflow.com/users/1774414/raistmaj一起想出来了

原来widthglTexStorageglTexSubImage中都是数组中元素的个数,所以1,不管分量个数.

此外,glActiveTexture 必须在 glBindTexture 之前调用(duh!!)

关于c++ - opengl 1D 纹理 : fill with arbitrary float values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41128063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com