当前位置: 首页 > 知识库问答 >
问题:

OpenGL采样器对象未更新绑定纹理

宿楚青
2023-03-14

我目前正在将一个采样器对象绑定到一个纹理单元(具体来说是GL_TEXTURE12)上

glBindSample(12,采样器)

与纹理自身的设置相比,初始设置非常明显。但是当我用

glSamplerParameteri(采样器,GL_TEXTURE_***_FILTER,过滤器);

绑定到纹理单元的纹理过滤与之前相同,从任何角度看都没有明显的变化。

在参数更改后,我尝试将采样器重新绑定到纹理单元,但我很确定这不是必需的。

我可以做些什么改变来让它工作?

共有1个答案

郝池暝
2023-03-14

因为我无法解释为什么会这样说:“我已经尝试在参数更改后再次将纹理单元重新绑定到采样器,但我非常确定这不是必需的。”在注释中没有意义,请考虑以下C伪代码。

/* Thin state wrapper */
struct SamplerObject {
  SamplerState sampler_state;
};

/* Subsumes SamplerObject */
struct TextureObject {
  ImageData*   image_data;
  ...
  SamplerState sampler_state;
};

/* Binding point: GL4.x gives you at least 80 of these (16 per-shader stage) */
struct TextureImageUnit {
  TextureObject* bound_texture; /* Default = NULL */
  SamplerObject* bound_sampler; /* Default = NULL */
} TextureUnits [16 * 5];


vec4 texture2D ( GLuint n,
                 vec2   tex_coords )
{
  /* By default, sampler state is sourced from the bound texture object */
  SamplerState* sampler_state = &TextureUnits [n]->bound_texture->sampler_state;

  /* If there is a sampler object bound to texture unit N, use its state instead
       of the sampler state built-in to the bound texture object. */
  if (TextureUnits [n]->bound_sampler != NULL)
    sampler_state = &TextureUnits [n]->bound_sampler->sampler_state;

  ...
}

我认为,造成混淆的原因是,在GLSL中,用于识别从哪个纹理图像单元采样(以及如何采样)的制服被称为sampler[…] 。希望这能消除一些困惑,让我们都站在同一页上。

 类似资料:
  • 我对如何将纹理绑定到GLSL中的插槽有点困惑。以下是我的着色器: 当我设置矩阵时,我需要查询统一位置,然后手动设置该位置的值,执行如下操作: 然而,据我所知,我不需要这样做来初始化我的纹理采样器。在设置时,我似乎只需要这样做: 所以,我的问题是,为什么我不需要对纹理进行与矩阵相同的处理?OpenGL运行时如何“知道”我绑定的纹理应该是我定义的采样器?如果我想拥有多种纹理,我该怎么做呢?

  • 我试图理解OpenGL 4.5中的纹理、纹理单位和采样器。我在附上一张我想弄明白的照片。我认为在我的例子中,一切都是正确的,但我不太确定右侧带有问号的1D采样器。 因此,我知道OpenGL提供了许多纹理单元/绑定点,可以在其中绑定纹理和采样器,以便它们协同工作。 这些绑定点中的每一个都可以支持每个纹理目标中的一个(在我的例子中,我将目标和绑定到绑定点,另一个绑定点)。 此外,采样器可以以大致相同的

  • 我是OpenGL的新手,在整理如何将纹理和着色器绑定到VBOs时遇到了困难。 我正在使用Cinder的纹理和着色器类。以下是我绘制方法的一部分: 在上面的代码中,如果我注释掉对mShader的调用。bind(),我的球体VBO将显示纹理(myImage)。我的着色器适用于普通(无纹理)形状,但当我在绘制任何带有包裹纹理的形状之前绑定着色器时,它会阻止纹理显示。 这是我使用的着色器的问题,还是我不理

  • 我希望在2D OpenGL应用程序上实现着色器。我的计划是将场景渲染到帧缓冲区对象,然后使用着色器将该帧缓冲区对象渲染到屏幕。 这是我绘制到帧缓冲区对象的场景,然后从那里绘制到屏幕。使用箭头键可以让月亮四处移动(我很自豪!) 但是,当我尝试使用着色器程序将帧缓冲区对象渲染到屏幕上时,我得到以下结果: 这是非常可悲的。这个片段着色器是我从一个教程中得到的,我相信问题一定是统一变量。 以下是片段着色器

  • 我正在尝试将多个纹理绑定到片段着色器中的采样器。加载代码似乎运行良好。ATI的CodeXL显示正确加载的纹理。 但是,当我将模型的纹理绑定到活动纹理0和1时,我无法让它将值发送到我的着色器。当我将着色器统一标记为usampler2D并使用uvec4存储颜色时,就像我应该做的那样,因为我的纹理是以无符号字节提供的,我得到了一个全白色的模型。当我将着色器统一更改为sampler2D并使用vec4存储颜

  • 使用OpenGL(核心配置文件,4.4),将同一个采样器对象同时绑定到2个不同的纹理单元是否“合法”? 我的测试表明它是有效的,但我不知道我的司机是否原谅了我,或者这是一项功能。