1

頂点シェーダーからフラグメント シェーダーにさまざまなビュー空間位置を渡すと、フラグメント シェーダーはカメラに対するフラグメントの位置 (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上記の例で渡されたものはスプライトの中心点になります)。

4

1 に答える 1

2

簡単な答え:ポイント スプライトの使用をやめます。本当に、彼らはひどいです。

単純ではない答え: ビュー空間の位置をフラグメント シェーダーに完全に渡すのをやめます。代わりに、ビューポート データなどに基づいてビュー空間の位置を計算するためgl_FragCoordに使用します。サンプルの 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あなたが探しているものです。

画面に合わせたクワッドを描画しているという事実を利用して、おそらくそれを行うより高速な方法があります。ポイントサイズと使用法が関係しgl_PointCoordます。

于 2013-02-22T03:59:30.313 に答える