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

OpenGL-我需要在更新纹理之前解除绑定吗?

汪弘毅
2023-03-14

我使用一个简单的1D纹理将一组值动态传递给我的像素着色器。我希望能够随时更新这些数组值(以及数组的大小)。目前,我正在使用序列

glBindTexture(GL_TEXTURE_1D, myTexture);
glTexImage1D(GL_TEXTURE_1D, 0, GL_R32F, arraySize, 0, GL_RED, GL_FLOAT, array);

为此。虽然这在初始化时工作正常,但在渲染期间(在键盘输入上)执行这些行会在glTexImage1D之后产生GL_INVALID_操作

那么,在更新纹理之前,我需要停用或解除绑定纹理吗?

共有2个答案

秦凯定
2023-03-14

我终于找到了错误的原因。由于我更新了键盘输入的纹理数据,相应的代码是从另一个线程(不同于主渲染线程)执行的。

解决方案是将此操作存储在一个队列中,该队列可由主渲染线程访问和执行。

酆阳煦
2023-03-14

实际上,纹理必须绑定才能更新,否则OpenGL如何知道要更新的纹理(请注意,在glTexImage*函数的任何地方都没有使用纹理ID)?

如果在调用该函数后的某个时间点上得到GL_INVALID_操作,则可能是触发错误的其他原因。我会开始向代码中添加glGetError()方法,直到找到导致错误的确切函数。

 类似资料:
  • 我有一个用于OpenGL中模型渲染的纹理数组。此数组包含漫反射和镜面纹理。由于某些网格没有镜面纹理,因此我在每次渲染后简单地将NULL纹理绑定到我的镜面采样器,并且只有当网格具有镜面纹理时,我才绑定一个。但是,我仍然在没有镜面纹理的网格上看到镜面纹理。 这是我的渲染代码 材质索引保存数组中纹理的索引,如果网格没有镜面纹理 索引为-1 纹理单元0用于漫反射 纹理单元2用于镜面

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

  • 在我的程序中,我使用了2种纹理:t0和t1。t1是附加的,仅在某些情况下需要: 绘图着色器: 它的工作原理很好:第二个纹理在需要时首先重叠。假设使用glBindTexture(..,0)返回零纹理(0,0,0,0),但在将NVidia驱动程序更新到314.07后,我的代码会出现黑屏,比如glBindTexture(..,0)返回(0,0,0,1)纹理。 我做了一些测试:使用着色器 我在旧驱动程序(

  • 我目前正在将一个采样器对象绑定到一个纹理单元(具体来说是GL_TEXTURE12)上 与纹理自身的设置相比,初始设置非常明显。但是当我用 绑定到纹理单元的纹理过滤与之前相同,从任何角度看都没有明显的变化。 在参数更改后,我尝试将采样器重新绑定到纹理单元,但我很确定这不是必需的。 我可以做些什么改变来让它工作?

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

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