Mugichoko's blog

読者です 読者をやめる 読者になる 読者になる

Mugichoko’s blog

プログラミングを中心としたメモ書き.

GLSLのCompute ShaderでZバッファを読み込む際のトラブルと解決方法

問題

GLSLのCompute ShaderでZバッファを読み込みたかったのだが,下記のリンクと同じ問題に遭遇した.

stackoverflow.com

簡単には,Zバッファを可視化したところ,ワイヤーフレームが強調された用な結果が出力されてしまう問題だ. 結果的に,私の場合は単なる記述ミス(バグ)だった.

問題に遭遇した手順

  1. カラーバッファとZバッファをアタッチしたFBOに3DCGを描画
  2. 1のZバッファ (GL_DEPTH_COMPONENT) をCompute Shaderに読み込み何らかの処理を実行し,テクスチャとして出力
    • 今回は,非線形に保存されているZバッファ値を線形に直す処理を行った(正に,上記のリンクにある内容と同じ!)
  3. 2のテクスチャをバックバッファに描画
  4. 3DCGのポリゴンの面にワイヤーフレームが加わったようなZバッファが描画される
    • 本来はワイヤフレームがない結果がほしい f:id:Mugichoko:20170517171951j:plain

実装環境

解決方法

FBOでZバッファを用意する時,internalFormatを「GL_DEPTH_COMPONENT」ではなく「GL_DEPTH_COMPONENT32F」とする.

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, w, h, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);

↓ 修正後

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, w, h, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);

修正結果が以下の通り.ワイヤーフレームのような画素が消えた.

f:id:Mugichoko:20170517172221j:plain

所感

よく分からないのは,最初に挙げたリンクでは既に今回の修正に相当する記述になっているのに同じ問題が起きることだ.