0

誰かがこの拡張機能を正常に使用しましたか?Khronosの仕様はここで読むことができます:NV_depth_nonlinearextension

私はEGL設定を選択して拡張機能を正常にチェックしました:

public class CustomEGLConfigChooser implements EGLConfigChooser {
    private static final int EGL_DEPTH_ENCODING_NV      = 0x30E2;
    private static final int EGL_DEPTH_ENCODING_NONLINEAR_NV = 0x30E3;
    private int[] mValue = new int[1];


    public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
        // request configs
        EGLConfig[] configs = egl.eglChooseConfig(...);
        // ...

        EGLConfig bestConfig = null;        
        for(EGLConfig config : configs){
            // check for EGL_DEPTH_ENCODING_NV
            egl.eglGetConfigAttrib(display, config, EGL_DEPTH_ENCODING_NV, 0);
            int hasDepthNonLinear = findConfigAttrib(egl, display, config, EGL_DEPTH_ENCODING_NV, 0);
            if(hasDepthNonLinear == EGL_DEPTH_ENCODING_NONLINEAR_NV) {
                // what to do now ???...
            }
        }
        return bestConfig;
    }

    private int findConfigAttrib (EGL10 egl, EGLDisplay display, EGLConfig config, int attribute, int defaultValue) {
        if (egl.eglGetConfigAttrib(display, config, attribute, mValue)) {
            return mValue[0];
        }
        return defaultValue;
    }
}

しかし、非線形深度拡張をどのように使用しますか?使用する必要があります:

glBindRenderbuffer(...);
glRenderbufferStorage(...);
4

2 に答える 2

1

GPUの非線形Zバッファの使用を開始するには、拡張機能を有効にする必要があります(コードで行ったように)。

非線形ZバッファはGPU自体によって処理され、多くの場合、私たちが気付いていないように、最新のGPUのほとんどで使用されています。

この興味深い記事(http://www.sjbaker.org/steve/omniv/love_your_z_buffer.html)で報告されているように:

Zの解像度。

人々がしばしば気付かないのは、ほとんどすべてのマシンで、Zバッファが非線形であるということです。Zバッファメモリに保存されている実際の数値は、次のようにオブジェクトのZ座標に関連付けられています。

z_buffer_value =(1 <

どこ:

 N = number of bits of Z precision
 a = zFar / ( zFar - zNear )
 b = zFar * zNear / ( zNear - zFar )
 z = distance from the eye to the object

...そしてz_buffer_valueは整数です。

これは、Z(したがってZの精度)がz_bu​​ffer_valueの逆数に比例することを意味します。したがって、目の近くには多くの精度があり、遠くにはほとんど精度がありません。この相互動作は、目の近くにあるオブジェクトを非常に詳細にレンダリングする必要があり、詳細なオブジェクトにはより優れたZ精度が必要なため、いくらか便利です。

ただし、これの望ましくない結果は、Zバッファのビットの多くが無駄になることです。つまり、クリッププレーンの近くに非常に細かいディテールが保存されます。近くのクリップを目の近くに引くと、これまで以上に多くのビットが、少し離れた精度にかなりのコストをかけて、あなたに近いものをレンダリングするタスクに専念します。

したがって、ほとんどの場合、ちらつきを大幅に減らすことができます。または、近くのクリップ面を目から遠ざけることで、ちらつきをなくすこともできます。

私の謙虚な経験では、この応答で提案したように、TEGRAで非線形ZBufferを正常に使用しました。したがって、前述のように機能すると言えます。

于 2012-07-04T12:58:34.583 に答える
0

eglChooseConfigNexus 7でテストしたところ、通話に追加することでこれを機能させることができました。

EGL_DEPTH_ENCODING_NV, EGL_DEPTH_ENCODING_NONLINEAR_NV,

とを使用して

DEPTH_COMPONENT16_NONLINEAR_NVGL_DEPTH_COMPONENT16私たちのglRenderbufferStorage呼び出しの代わりに。

編集:実際には、メインのeglサーフェスにデプスバッファを使用していないため、GL_DEPTH_COMPONENT16_NONLINEAR_NV必要なのは1つだけです。また、NDKで定義されているとおりに変更されましたDEPTH_COMPONENT16_NONLINEAR_NVGL_DEPTH_COMPONENT16_NONLINEAR_NV

于 2013-07-16T17:25:25.243 に答える