2012-12-07 28 views
1

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

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

回答

1

“在该像素处的UV贴图坐标” - 确实,但在顶点着色器中没有任何像素。你错过了点精灵实际上是如何工作的。单个顶点着色器调用输出大于1像素的gl_PointSize会导致对该点进行多个片段着色器调用(因为该点很好地覆盖了多个像素)。这些碎片根据它们在这个较大点精灵中的位置得到他们的gl_PointCoord。但是覆盖多个碎片的每个点精灵总是由单个顶点产生。所以从概念上讲,这个单顶点gl_PointCoord对于每个顶点只是(0.5, 0.5),但最终甚至没有任何意义,因为实际上没有任何像素的概念,更不用说顶点着色器内的每像素UV坐标了。

“但你可以用另一种方式发送它” - 我确定这是非常非正式的意思,因为当然你不能将任何数据从片段着色器发送到顶点着色器,因为只有图形管道以单一方向工作。

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

+0

我没有制作点精灵。我有一些细长的条纹,我想根据UV坐标来移动顶点,因为它是一个非常方便的标准化浮线,告诉我沿着我的条纹有多远。或者'gl_PointCoord'只适用于点精灵,而不是一般的网格? –

+0

@AlexWayne确实,更新了我的答案。 –

+0

我现在意识到我的思维过程的错误在这里。我现在明显不能从frag到vert shader“发送”任何东西,现在我更多地考虑它。尽管我认为'uv'只是我想要的标识符,它是从顶点着色器开始工作的,但在深入研究示例之后。感谢您的澄清解释。 –

相关问题