【问题标题】:GLSL getting location of fragment on screenGLSL在屏幕上获取片段的位置
【发布时间】:2014-07-07 22:43:44
【问题描述】:

我正在尝试使用 GLSL 1.00 在片段着色器中访问视口中的片段位置,使用 3.30 我可以通过传递“vec2(gl_MultiTexCoord0);”来做到这一点作为从顶点着色器到片段着色器的变化。有谁知道是否可以这样做?

【问题讨论】:

  • 我要问...你需要这个做什么?
  • GLSL 1.00?你确定吗? AFAIK 从 1.10 版开始:en.wikipedia.org/wiki/OpenGL_Shading_Language#Versions
  • @vesan 适用于 iOS 应用程序。不能确切地说它是做什么的。尽管大声笑,我可能正在尝试以一种不太理想的方式来做到这一点。
  • @glampert glGetString(GL_SHADING_LANGUAGE_VERSION);返回“OpenGL ES GLSL ES 1.00”...也许这只是因为它在 iOS 模拟器中??
  • 是的,没关系。您正在使用 OpenGL ES。正如@derhass 在他的回复中所指出的那样,ES 着色语言从 1.0 开始。

标签: opengl glsl shader


【解决方案1】:

这里有几点值得注意:

  1. 您可以使用与 GLSL3.30 相同的原理。顶点和片段着色器之间通信的varying 关键字已被更通用的in/out concpet 取代,您可以使用它将值传递到下一个着色器阶段(在您的程序中)。

  2. GLSL1.00 并不真正存在。第一个真正的版本是 1.10。如果您指定 #version 100,您将获得 GL ES SH 1.0(它是 GLES 2.0 的原生版本)。

  3. gl_MultiTexCoord0 是一个已弃用的内置函数,它在 core 配置文件/core 版本着色器中不可用。您应该为此使用通用顶点属性。

  4. 任何版本的 GLSL 都支持内置的 gl_FragCoord 变量,它可以让您访问片段的屏幕空间坐标,因此这些东西都不是必需的。但是,您可能希望位置在 [0,1] 范围内(适合纹理),因此使用一些 texcoord 属性可能仍然是要走的路。 OTOH,仅将视口大小指定为 uniform vec2 可能仍然更有效,特别是如果您实际上在 CPU 上将其反转一次,因此这将归结为每个片段一个向量乘法。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多