【问题标题】:What values can an OpenGL shader access that are set before rendering?OpenGL 着色器可以访问在渲染之前设置的哪些值?
【发布时间】:2016-01-04 06:11:04
【问题描述】:

如果我有一个简单的 OpenGL 着色器同时应用于多个立方体,那么统一值会变慢。我注意到像 glColor3f 这样的东西并没有减慢它的速度(至少从我尝试过的情况来看),但目前正在使用 glColor3f 作为一种黑客,以便着色器可以读取 gl_Color 并且我可以使用它类似于制服用于确定立方体的哪一侧被渲染用于与面无关的平面照明。

我正在使用显示列表,所以我使用了 glColor3f,因为它已被添加到列表中,并且在创建列表时只是在每个面之前使用了不同的颜色。现在,我想在渲染之前设置更多值(这次不在显示列表中)。

我可以从 OpenGL 执行哪些可以在着色器中读取的调用?在渲染之前,我需要将 0-8 的 6 个整数发送到着色器中,但我以后可能会设法缩小它。

【问题讨论】:

  • 如果您使用现代 OpenGL,这种事情会容易得多,而不是尝试将固定功能管道 (glColor3f) 和过时的 API(显示列表)与更新的功能 (着色器)。通常,您将定义属性、统一、统一缓冲区、纹理、着色器存储缓冲区等的组合,并且着色器可以读取所有这些。听起来你想要属性。

标签: opengl glsl shader


【解决方案1】:

我建议使用数据类型为ivec2ivec3ivec4 的统一块或统一,使用它们您可以一次编写2、3 或4 个int

除此之外,还有一些内置的制服。除了矩阵,还有gl_DepthRangegl_Foggl_LightSource[gl_MaxLights]gl_LightModelgl_FrontLightModelProductgl_BackLightModelProductgl_FrontLightProduct[gl_MaxLights]gl_BackLightProduct[gl_MaxLights]gl_FrontMaterial、@98765433 、gl_TextureEnvColor[gl_MaxTextureUnits]gl_ClipPlane[gl_MaxClipPlanes]gl_EyePlaneS[gl_MaxTextureCoords]gl_EyePlaneT[gl_MaxTextureCoords]gl_EyePlaneR[gl_MaxTextureCoords]gl_EyePlaneQ[gl_MaxTextureCoords]gl_ObjectPlaneS[gl_MaxTextureCoords]gl_ObjectPlaneT[gl_MaxTextureCoords]gl_ObjectPlaneR[gl_MaxTextureCoords]gl_ObjectPlaneQ[gl_MaxTextureCoords]

但是从着色器读取全局数据的预期方式是统一变量。另一种方法是在纹理中编码信息。

【讨论】:

  • 使用 VBO 和其他较新的渲染方法是否有助于加快速度?我正在制作类似于 Minecraft 的东西来娱乐和学习。我有 Frustum Culling,它不会渲染完全包围的块,所以没有通过制服我可以获得相当好的帧速率。现在我想为单个面实现平面照明,我做了我所说的来控制一个面的照明。它有效,但如果我有足够的块,那么它会比我想要的滞后得多。但是,如果我设置了近距离的渲染距离,系统确实可以工作。
  • @Cello Code 我对 VBO 的经验较少。我建议阅读这个问题的答案Does interleaving in VBOs speed up performance when using VAOs
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 2012-02-27
  • 1970-01-01
相关资源
最近更新 更多