获取点精灵中的视图坐标

时间:2013-02-22 02:29:27

标签: opengl-es glsl webgl

如果将变化的视图空间位置从顶点着色器传递到片段着色器,则片段着色器可以知道片段相对于摄像机的位置(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以上示例将用于精灵的中心点?

1 个答案:

答案 0 :(得分:2)

简单回答:停止使用点精灵。真的,它们很糟糕。

不太简单的答案:停止将视图空间位置完全传递给片段着色器。相反,请使用gl_FragCoordcompute 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;

您需要为片段着色器提供viewportinvPersMatrix值。 gl_DepthRange是内置的。 eyePos是您正在寻找的。

可能有一种更快的方法可以利用您绘制屏幕对齐的四边形这一事实。它将涉及点大小并使用gl_PointCoord