2011-10-15 51 views
4

我試圖做到:我的繪畫場景的深度地圖上我的場景的頂部(使物體越接近暗,漸行漸遠更輕)GLSL質地傳遞從頂點着色器座標

問題:我似乎無法理解如何從我的頂點着色器向我的片段着色器傳遞正確的紋理座標。

因此,我創建了我的FBO,深度圖得到的紋理......並不是我完全確定我在做什麼,但是無論如何,它都可以工作。我測試了使用固定功能流水線繪製紋理,它看起來就像它應該(深度圖)。

但是,試圖在我的着色器只是工作不使用它...

下面是部分從我的渲染方法結合紋理:

glActiveTexture(GL_TEXTURE7); 
glBindTexture(GL_TEXTURE_2D, depthTextureId); 
glUniform1i(depthMapUniform, 7); 
glUseProgram(shaderProgram); 
look(); //updates my viewing matrix 
box.render(); //renders box VBO 

所以...我認爲這是對嗎?也許?不知道爲什麼質地7,那只是一些在教程我檢查......

下面是從我的頂點着色器重要的東西:

out vec4 ShadowCoord; 

void main() { 
    gl_Position = PMatrix * (VMatrix * MMatrix) * gl_Vertex; //projection, view and model matrices 
    ShadowCoord = gl_MultiTexCoord0; //something I kept seeing in examples, was hoping it would work. 
} 

AAAND,片段着色器:

in vec4 ShadowCoord; 
in vec3 Color; //passed from vertex shader, didn't include the code for it though. Just the vertex color. 

out vec4 FragColor; 

void main(
    FragColor = vec4(texture2D(ShadowMap,shadowCoord.st).x * vec3(Color), 1.0); 

現在的問題是,片段着色器接收紋理的座標總是(0,0)或左下角。我試着將它改爲ShadowCoord = gl_MultiTexCoord7,因爲我認爲它可能與我把紋理放在7號插槽中有關......但是,問題依然存在。當(0,0)的顏色改變時,整個場景的顏色也會改變,而不是僅適用於相應的像素/片段的顏色改變。

這就是我希望得到的一些見解......如何傳遞正確的座標(我希望紋理的角落與屏幕的角落座標相同)。是的,這是一個初學者的問題......但我一直在尋找橙皮書,其問題在於它在GLSL方面很棒,但OpenGL方面的例子嚴重缺乏我真的可以使用...

回答

4

輸入變量gl_MultiTexCoord0(或7)內置的每個頂點紋理座標第0(或7)紋理座標,(在使用即時模式)的gl(Multi)TexCoord設置或glTexCoordPointer(當使用陣列/ VBOs時)。

但是,由於您的深度緩衝區已經在屏幕空間中,所需要的不是放置在對象上的通常紋理,而是特定像素/片段紋理中的值。所以頂點着色器沒有任何涉及。相反,您只需使用當前片段的屏幕空間位置作爲紋理座標,即可使用gl_FragCoord在片段着色器中讀取該位置。但請記住,此座標位於[0,w] x [0,h]中,紋理通過[0,1]中的標準化紋理座標訪問。所以,你必須劃分的由屏幕尺寸協調片段:

uniform vec2 screenSize; 
... 
... texture2D(ShadowMap, gl_FragCoord.st/screenSize) ... 

但你其實並不需要兩遍這種效果,無論如何,因爲你可以直接使用片段的深度,而無需編寫它成紋理。取而代之的

texture2D(ShadowMap, gl_FragCoord.st/screenSize).x 

你可以使用

gl_FragCoord.z 

這無非是片段的深度值否則,將被寫入在第一遍的質感。這樣你就可以在第二遍中完全省去第一個深度寫入過程和紋理訪問。

相關問題