2017-01-25 1 views
1

私は、OpenGL ES 3.0でクリップ座標に提供される多くの三角形をレンダリングしています。変化を使用して、すべてのフラグメントに対して補間されたテクスチャ座標を生成します。しかしながら、補間は頂点のz座標を使用するので、補間はスクリーン空間において線形ではない。 GLESは、私が知っている限り、私が望んでいると思われる非専門的な修飾子をサポートしていません。GLES and noperspective

回避策がありますか?私はzを使わないでクリップ座標を供給することができましたが、深度テストにはzが必要です。

よろしく

答えて

1

私はあなたのケースでは、あなたが(ES3でサポートされている)フラグメントシェーダで深さを修正することができると信じて。その位置からZの座標を削除しながら、それを使って奥行きを設定することができます。しかし、Zコンポーネントには別の値が必要です。

だから、フラグメントシェーダであなたのようなものを持っているでしょう:

... 
varying zPositionComponent; 
... 
    vac4 actualVertexPosition = ...; // whatever you had in gl_Position 
    zPositionComponent = actualVertexPosition.z; 
    gl_Position = vec4(actualVertexPosition.x, actualVertexPosition.y, 0.0, actualVertexPosition.w); 

は、フラグメントシェーダは、単にgl_FragDepth = zPositionComponent;

注意として、フラグメント奥行き補正を追加します。私はこれが動作することを確認していない場合、またはあなたは実際にこれをサポートしています。実際にはフラグメントの現在の深さを確認し、フラグメントを破棄する必要があります(手動で深さバッファを実行する)。複雑になる可能性があります...どうすればよいのか教えてください。

+0

、それは初期の深さテストを排除する:

attribute vec2 a_uv; varying vec3 v_uv; vec4 pos = MVP * vertex; gl_Position = pos; v_uv = vec3(a_uv * pos.w, pos.w); 
次いで、フラグメントシェーダで

私は避けたいものです。 – user5024425

+0

はい、それは私がマニュアル深度バッファテストで意味したものです。それは複雑になる。それでももっと良い解決策がないかもしれません...深度バッファを使ってステンシルバッファにシェイプ "ID"を書き込んだ後、Z座標なしで再描画すると思いますが、それはさらに悪くなります。まさにあなたがやっていること。 –

+0

基本的に私はいくつかのビルボード/ 2Dクワッドを描いていますが、ジオメトリにはまだシーンの残りの部分で正しいz-Testingがあるはずです。 – user5024425

0

OpenGLは、位置のwコンポーネントを使用してパースペクティブを修正します。詳細は、specificationの式13.7を参照してください。 gl_fragdepthを使用するこのhttps://www.khronos.org/opengl/wiki/Depth_Testデプステストによれば

vec2 uv = v_uv.xy/v_uv.z; 
関連する問題