【问题标题】:OpenGL texture base internal format to a shaderOpenGL纹理基础内部格式到着色器
【发布时间】:2010-01-27 22:00:07
【问题描述】:

我正在尝试使用着色器模拟 OpenGL glTexEnv 的行为。这是一个相当复杂的功能,但应该是可行的。唯一的问题是函数的工作方式因纹理基础内部格式而异。如何从纹理中获取该信息?纹理基础内部格式是由 glTexImage2D 函数给出的,所以我必须将它保存到某个变量中,然后根据绑定的纹理将其传递给着色器,或者我可以通过 OpenGL 以某种方式获得它吗?

【问题讨论】:

  • 内部格式如何影响着色器?
  • @Luca 您可能有一个纹理,例如只有一个通道(假设只有红色值,编码为 32 位)。现在,如果您的着色器需要至少两个通道(例如,红色和绿色),您在提供单通道纹理时可能会遇到问题。

标签: opengl shader


【解决方案1】:

似乎纹理混合值不是内置制服的一部分。

http://www.opengl.org/sdk/libs/OpenSceneGraph/glsl_quickref.pdf

一般有两种方法可以模仿 FFP 行为:

  1. 一个大着色器,将值传递给着色器...
  2. 根据需要动态地为每种行为和内部格式创建着色器。

我更喜欢第二种方式,因为它不会产生一个又大又慢的全能着色器。 取而代之的是,您会得到小的特定着色器。

另外:这个常见问题被称为“组合着色器爆炸”问题。

【讨论】:

  • 实际上,您/不能/在单个着色器中实现所有内容。假设您为纹理单元 0 启用了 TEXTURE_3D 和 TEXTURE_2D 目标。固定函数规范表示将对 3D 纹理进行采样。可编程管道表示着色器根据它使用的采样器决定将采样的内容。这意味着您必须为每个纹理目标组合构建一个特定的着色器。 1D/2D/3D/立方体,有 8 个纹理单元,为您提供 64K 着色器可能性...
【解决方案2】:

不,纹理基础内部格式不能直接用于着色器。如果您不想自己存储它,您可以随时询问 GL 它的值以将其传递给您的着色器。

glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &outFormat)`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多