【问题标题】:Can only use glActiveTexture(GL_TEXTURE0) and not other texture units? [closed]只能使用 glActiveTexture(GL_TEXTURE0) 而不能使用其他纹理单元? [关闭]
【发布时间】:2021-02-25 09:23:56
【问题描述】:

我对 OpenGL 中的纹理和立方体贴图感到困惑。

假设我想要基本的纹理映射。我愿意:

  GLuint texture0;
  glGenTextures(1, &texture0);
  glActiveTexture(GL_TEXTURE0);
  glBindTexture(GL_TEXTURE_2D, texture0);

然后我设置glTexImage2D 并拨打glUniform1i(glGetUniformLocation(shader_program, "texture_sampler"), GL_TEXTURE0) 一切都很好。

现在,我还想使用立方体贴图进行环境映射。我想,也使用this post 作为参考,我应该这样做:

  GLuint texture1;
  glGenTextures(1, &texture1);
  glActiveTexture(GL_TEXTURE0+1); 
  glBindTexture(GL_TEXTURE_CUBE_MAP, texture1);

然后是glUniform1i(glGetUniformLocation(shader_program, "cubemap_sampler"), GL_TEXTURE0+1)

但是,这不起作用,只会渲染黑色对象。 另一方面,如果我不运行glActiveTexture(GL_TEXTURE0+1),而是坚持使用GL_TEXTURE0,一切都很好。

按照我的理解,不应该是这样的……

任何人都可以了解发生了什么吗?

我正在使用 GLSL #version 440

【问题讨论】:

  • glUniform1i 的参数不应该是GL_TEXTURE0偏移量吗?所以glUniform1i(glGetUniformLocation(shader_program, "cubemap_sampler"), 1)。见"Binding textures to samplers"

标签: opengl texture-mapping


【解决方案1】:

glUniform1i(glGetUniformLocation(shader_program, "texture_sampler"), GL_TEXTURE0+1) 是个奇怪的想法。

纹理单元是纹理对象和纹理采样器之间的整体绑定点。 GL_TEXTURE0 是用于glActiveTexture 的枚举器常量。 GL_TEXTURE0地址纹理单元0。
您需要在纹理采样器制服上设置的值不是纹理单元,而是纹理单元的“名称”。因此你必须设置 0 而不是 GL_TEXTURE0:

glUniform1i(glGetUniformLocation(shader_program, "texture_sampler"), GL_TEXTURE0+1)

glUniform1i(glGetUniformLocation(shader_program, "texture_sampler"), 1)

请注意,采样器绑定点默认为 0。指令glUniform1i(..., GL_TEXTURE0+1) 导致INVALID_VALUE 错误并且根本不会更改绑定点。
OpenGL Shading Language 4.60 Specification - 7.6.1 Loading Uniform Variables In The Default Uniform Block

如果使用Uniform1i{v} 设置一个INVALID_VALUE错误 采样器统一到小于零或大于或等于该值的值 MAX_COMBINED_TEXTURE_IMAGE_UNITS

【讨论】:

  • 谢谢。但是,glActiveTexture(GL_TEXTURE0+1); glUniform1i(env_sampler_location, 1); 也会渲染黑色对象。但是如果我把它改成glActiveTexture(GL_TEXTURE0); glUniform1i(env_sampler_location, 0);,它就可以了。
  • @Supernormal 您不是新用户。您现在评论部分不打算提出其他问题。你知道你有Ask a public question。无论如何,您没有在问题中提供足够的信息来发现新问题。
猜你喜欢
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多