opengl-es - 我可以在顶点着色器中访问 gl_PointCoord 吗?

gl_PointCoord 返回表示该像素处 UV 贴图坐标的 2D 向量。但它似乎只在片段着色器中可用。我知道您可以使用 varying 将值从顶点着色器发送到片段着色器,但是您能以其他方式发送吗?我可以获得当前顶点的 UV 坐标吗?

是否可以在顶点着色器中访问 gl_PointCoord

最佳答案

“该像素处的 UV 映射坐标” - 的确如此,但在顶点着色器中您没有任何像素。你错过了点 Sprite 的实际工作方式。单个顶点着色器调用发出大于 1 像素的 gl_PointSize 会导致针对该点的多个片段着色器调用(因为该点覆盖多个像素)。这些片段根据它们在这个更大的点 Sprite 中的位置获得它们的 gl_PointCoord。但是覆盖多个片段的每个点 Sprite 总是来自单个顶点。所以从概念上讲,每个顶点的 gl_PointCoord 只是每个顶点的 (0.5, 0.5),但最后即使这样也没有意义,因为确实没有任何像素的概念,更不用说顶点着色器中的每个像素 UV 坐标了。

“但是你能用另一种方式发送吗” - 我确信这是相当非正式的意思,因为你当然不能将任何数据从片段着色器发送到顶点着色器,因为图形管道仅在一个方向上工作。

编辑:关于您的评论,如果不使用点 Sprite ,gl_PointCoord 变量根本没有任何意义。您不能将它用作一般的 UV 坐标(片段着色器应该如何得出合理的值)。为此,您必须自己从顶点着色器中输出一个有效的纹理坐标(作为 varying),然后将其插值到要在片段着色器中访问的片段上,最终可能会传递到顶点着色器中作为一个额外的属性,和往常一样。

https://stackoverflow.com/questions/13759424/

相关文章:

debugging - ANTLRWorks调试——不同颜色的含义?

jenkins - 如何在 jenkins slave agent 重启后重新启动构建应用程序

ruby - 添加单例方法和访问实例变量 - 未定义

php - 关闭旧的 php websocket

c# - Reader.Read() 无法读取行,即使它有行

groovy - Jira 工作流脚本验证器的返回码

scala - 如何复制实例并覆盖特征中声明的值字段

jdbc - 如何使用 clojure.jdbc 查询列表

sql - 即使深度在 3 - 4 左右,MPTT 对于维护像数据库这样的树是否有点矫枉过正?

bash - 使用 root 权限执行 CGI 脚本的最佳方法是什么?