opengl中纹理单元和采样器制服之间的对应关系

2023-12-12

采样器制服和纹理单元之间的对应关系glActiveTexture显然无法使用 opengl 进行查询,并且我找不到关于如何查找哪个纹理单元映射到哪个采样器制服的良好文档。这是我能找到的:

  • 如果程序中只有采样器制服,那么它会映射到gl_TEXTURE0
  • 如果单个程序阶段中有多个采样器制服,则它们将按照它们在着色器中声明的顺序进行映射。
  • 如果顶点着色器和片段着色器具有不相交的采样器制服集,则顶点着色器中的采样器首先出现,然后是片段着色器中的采样器。
  • 此行为似乎是由规范定义的。

例如,如果顶点着色器定义:

uniform sampler2D color;

片段着色器定义:

uniform sampler2D tex;
uniform sampler2D norm;

Then color被映射到gl_TEXTURE0, tex被映射到gl_TEXTURE1, and norm被映射到gl_TEXTURE2。但如果顶点着色器定义:

uniform sampler2D norm;

那么不同的纹理是如何映射的就不清楚了。由于可能存在布局限定符或单独的着色器阶段,这变得更加复杂。

我似乎在任何地方都找不到这方面的文档。我所知道的关于它的一切要么来自我自己的实验,要么来自 Stackoverflow 或 OpenGL 论坛上的答案。有谁知道在所有可能的情况下如何工作的一套全面的规则,或者查询采样器对应的纹理单元的方法?


这是我能找到的:

  • 如果程序中只有采样器制服,那么它会映射到gl_TEXTURE0
  • 如果单个程序阶段中有多个采样器制服,则它们将按照它们在着色器中声明的顺序进行映射。
  • 如果顶点着色器和片段着色器具有不相交的采样器制服集,则顶点着色器中的采样器首先出现,然后是片段着色器中的采样器。
  • 此行为似乎是由规范定义的。

这些都不是真的。好吧,第一个是正确的,但只是偶然的。

所有未在着色器中初始化的统一值都被初始化为值 0。规范对此非常明确:

任何没有绑定限定符声明的统一采样器或图像变量最初都绑定到单元零。

采样器制服的值是它所代表的纹理单元的整数索引。所以 0 值对应于GL_TEXTURE0。所有未初始化的采样器制服的值应为 0。

如果您描述的行为正在发生,那么该实现就在违反OpenGL 规范。

除非你使用layout(binding = )语法来分配制服的纹理单元,你必须manually在 OpenGL 代码中,为每个采样器统一分配其纹理单元的值。这是通过设置其统一值来完成的,就像任何其他整数统一一样:您调用glUniform1i与该制服对应的位置。因此,如果你想将它与纹理图像单元索引 4 关联起来,你可以调用glUniform1i(..., 4), where ...是该制服的统一位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opengl中纹理单元和采样器制服之间的对应关系 的相关文章

  • 在着色器中旋转法线

    我有一个场景 其中有多个具有各自位置和旋转的模型 给定法线 着色器对每个像素应用简单的双向照明 那是我的顶点着色器 version 150 in vec3 position in vec3 normal in vec2 texcoord o
  • 仅在发布模式下使用 glGenBuffer 时出现未处理的异常 - QT

    我在 Windows 7 上使用 Qt 4 8 发布模式编译项目时遇到了一些问题 调试时一切正常 但在发布时我收到未处理的异常 0xC0000005 访问冲突 我将范围缩小到发生这种情况的行 即生成像素缓冲区的时间 我的第一个猜测是 DLL
  • OpenGL 缓冲区、glFlush 和 glutSwapBuffers()

    使用之间有什么区别吗 glutInitDisplayMode GLUT SINGLE GLUT RGB with glFlush and glutInitDisplayMode GLUT DOUBLE GLUT RGB with glutS
  • 如何在 OpenGL 中绘制镜像某些东西的镜子?

    根据我的理解 要在 OpenGL 中进行镜像 您基本上需要绘制场景 然后将所有内容翻转并再次绘制 只是使其通过镜子可见 从而在镜子中创建完美翻转的图像 但我看到的问题是 执行此操作时 唯一可以看到其他镜子的镜子是在前一个镜子之后渲染的镜子
  • 开启TK onRenderFrame和onUpdateFrame的区别?

    我目前正在使用 OpenTK 框架和 OpenGL 用 C 编写 Jump n Run 游戏 Open TK 提供预设功能 例如GameWindow Run or GameWindow onUpdateFrame onRenderFrame
  • 如何使用OpenGL数组纹理?

    我正在尝试在OpenGL中使用精灵表 通过数组纹理实现它这就是我加载纹理的方式 QImage image image load C QtProjects project images spritesheet png png const un
  • OpenGL 新手: glutMouseFunc

    我试图在单击鼠标后更改球体位置 但在使用 glutMouseFunc 中的 x 和 y 时它不起作用 以下是代码 include stdafx h include
  • OpenGL 计算着色器调用

    我有一个与新计算着色器相关的问题 我目前正在研究粒子系统 我将所有粒子存储在着色器存储缓冲区中 以便在计算着色器中访问它们 然后我派遣一个一维工作组 define WORK GROUP SIZE 128 shaderManager gt u
  • 在 OpenGL 中设置 MVP 矩阵

    我正在尝试学习 OpenGL 的基础知识 但我在设置变换矩阵时遇到问题 我制作了模型 视图和投影矩阵 但将它们发送到我的顶点着色器时遇到问题 这是代码 Set up MVP glm mat4 model glm mat4 GLint uni
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • glsl 着色器 - 颜色混合,正常模式(就像在 Photoshop 中一样)

    我试图创建混合 2 种颜色的效果 实际上是图像和颜色作为图像叠加 就像在 Photoshop 颜色叠加 和 正常混合 模式中一样 我正在使用 libgdx 这就是我到目前为止所拥有的 attribute vec4 a position at
  • Three.js 中的自定义纹理着色器

    我只是想创建一个非常简单的片段着色器 将指定的纹理绘制到网格上 我研究了一些实现相同功能的自定义片段着色器 并构建了我自己的着色器并围绕它支持 JS 代码 然而 它就是行不通 这是我尝试运行的代码的工作抽象 顶点着色器
  • 并排显示图像的一半 - OpenGL

    我为两个图像创建了两个纹理 现在我想在opengl中按图像2的左侧部分 完整的图像1 图像2的右侧部分的顺序显示该纹理 我已经做了如下 Image1 显示在 opengl 屏幕的中央 但屏幕的左右部分不正确 应分别显示 image2 的左侧
  • 为什么我无法将此纹理统一附加到我的 GLSL 片段着色器?

    在我的 Mac 应用程序中 我根据来自所连接相机的 YUV 4 2 2 数据定义了一个矩形纹理 使用标准顶点和纹理坐标 我可以将其绘制到屏幕上的矩形区域 没有任何问题 但是 我想使用 GLSL 片段着色器在 GPU 上处理这些图像帧 但在将
  • 如何在 Qt4 OpenGL 应用程序中启用 HiDPI (Retina) 支持?

    我正在使用带有 QGraphicsView 的 QGraphicsScene 如中所述这个文件 https doc qt io archives qq qq26 openglcanvas html 我打算最终将 Qt 小部件覆盖在我的 Op
  • 如何读取屏幕上的像素?

    我正在尝试为网页游戏制作一个简单的机器人 所以我希望能够读取屏幕上像素的颜色 我已经在 Windows 上使用 GetPixel 完成了此操作 但我似乎无法在 OS X 上弄清楚它 我一直在网上查找并遇到了 glReadPixel 当我在X
  • 如何获取片段的当前颜色?

    我正在尝试了解 GLSL 中的着色器 并且找到了一些有用的资源和教程 但我一直在寻找一些应该是基本且微不足道的东西 我的片段着色器如何检索当前片段 你通过说设置最终颜色gl FragColor whatever 但显然这是一个仅输出值 如何
  • 纹理映射和光照顶点着色器错误 Java OpenGL

    我正在尝试将纹理映射到 3D 立方体并尝试编写着色器以使其具有照明和纹理 我尝试过只编写纹理着色器并且它有效 我还尝试过仅将 3D 值设置为红色的照明着色器 并且该照明着色器也可以工作 但当我尝试将两者结合起来时 我遇到了问题 我在下面提供
  • Opengl 简单片段着色器在纹理上覆盖半透明三角形条

    我有一个带纹理的三角形条 形成一个四边形 当您单击它时 我希望周围的区域用半透明的四边形标记 这样您仍然可以看到下面的纹理 我的四边形显示正确 但它们根本不透明 并且完全覆盖了下面的任何内容 我有一个非常简单的片段着色器 我认为可以使用它g

随机推荐