如果将变化的视图空间位置从顶点着色器传递到片段着色器,则片段着色器可以知道片段相对于摄像机的位置(0,0,0
在视野中)。这对于每像素照明等很有用。例如:
precision mediump float;
attribute vec3 vertex;
uniform mat4 pMatrix, mvMatrix;
varying vec4 pos;
void main() {
pos = (mvMatrix * vec4(vertex,1.0));
gl_Position = pMatrix * pos;
}
但是,如果要渲染gl_POINTS
并在顶点着色器中设置gl_PointSize
,片段着色器如何确定每个片段的位置(如传递的pos
以上示例将用于精灵的中心点?
答案 0 :(得分:2)
简单回答:停止使用点精灵。真的,它们很糟糕。
不太简单的答案:停止将视图空间位置完全传递给片段着色器。相反,请使用gl_FragCoord
到compute the view-space position, based on viewport data and so forth。甚至还有样本的GLSL代码:
vec4 ndcPos;
ndcPos.xy = ((2.0 * gl_FragCoord.xy) - (2.0 * viewport.xy)) / (viewport.zw) - 1;
ndcPos.z = (2.0 * gl_FragCoord.z - gl_DepthRange.near - gl_DepthRange.far) /
(gl_DepthRange.far - gl_DepthRange.near);
ndcPos.w = 1.0;
vec4 clipPos = ndcPos / gl_FragCoord.w;
vec4 eyePos = invPersMatrix * clipPos;
您需要为片段着色器提供viewport
和invPersMatrix
值。 gl_DepthRange
是内置的。 eyePos
是您正在寻找的。 p>
可能有一种更快的方法可以利用您绘制屏幕对齐的四边形这一事实。它将涉及点大小并使用gl_PointCoord
。