2011-12-10 73 views
1

在shaders很新,所以如果我在這裏做一些愚蠢的事情,請耐心等待。 :)渲染深度緩存到紋理

我想在iOS上使用opengl ES 2.0渲染場景的深度緩衝區,但我似乎沒有得到完全準確的結果,除非模型具有相對較高的多邊形密度顯示。因此,例如,如果我渲染一個僅包含四個頂點的大平面,我會得到非常不準確的結果,但是如果我細分此平面,結果會爲每個細分獲得更準確的結果,並最終得到正確渲染的深度緩衝區。

這讓我想起了很多關於仿射與透視投影紋理映射的問題,我想我需要用「.w」組件來解決這個問題。但我認爲「變化」的變量應該考慮到這一點,所以我在這裏有點失落。

這是我的頂點和片段着色器:

[vert] 
uniform mat4 uMVPMatrix; 
attribute vec4 aPosition; 
varying float objectDepth; 
void main() 
{ 
    gl_Position=uMVPMatrix * aPosition; 
    objectDepth=gl_Position.z; 
} 

[frag] 
precision mediump float; 
varying float objectDepth; 
void main() 
{ 
    //Divide by scene clip range, set to a constant 200 here 
    float grayscale=objectDepth/200.0; 
    gl_FragColor = vec4(grayscale,grayscale,grayscale,1.0); 
} 

請注意,此着色器簡化了不少只是爲了強調我使用的方法。儘管對於肉眼來說,它似乎在大多數情況下運行良好,但事實上,我將其渲染爲32位紋理(通過將浮點數打包到ARGB中),並且我需要非常高的精度以用於後續處理,或者獲得明顯的工件。

我可以通過啓動多邊形計數來實現相當高的精度,但是這會使我的幀率下降很多,所以有更好的方法嗎?

編輯:爲了讓我說的更清楚的文物,我已經上傳了深度的一個截圖四個頂點平面從低角度看這裏:

http://www.imgjoe.com/x/testlpl.jpg

生成此屏幕截圖使用上面的着色器。

這可能有點微妙,但我希望有一個平滑的垂直漸變。相反,在某些相機位置,我會看到圖像中出現的橫向僞像。但是,如果我足夠細分飛機,我就不會有這種神器。

+0

我不太瞭解GL ES,但是你是否啓用了透視正確插值?或者ES有屬性的'smooth'限定符?另外,你說你正在將浮球包裝到ARGB中;你確定這實際上工作正常嗎? –

+0

是的,我徹底檢查了編碼器和解碼器,它工作正常。當使用常規的8位灰度時,我會遇到同樣的問題,只是不太明顯,所以我認爲編碼器不是罪魁禍首。我不知道有什麼像opengl ES 2.0中的透視校正插值開關?如果我對紋理座標進行插值,他們將使用透視投影進行插值,我只是假設對於插值的任何值都是如此。 – sinsro

+0

我用這個頁面的代碼進行編碼/解碼的方式如下:http://www.gamedev.net/topic/442138-packing-a-float-into-a-a8r8g8b8-texture-shader/ – sinsro

回答

2

您需要將w除以w分量。

0

這很簡單,深度不是線性的,所以你不能使用z的線性插值......如果你插入1/z而不是z,你將很容易解決它。您也可以按照rasmus的建議完成一些數學運算。 你可以在http://www.luki.webzdarma.cz/eng_05_en.htm(關於實現一個簡單的軟件渲染器的頁面)閱讀更多關於座標插值的信息