2011-10-15 53 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 

这无非是片段的深度值否则,将被写入在第一遍的质感。这样你就可以在第二遍中完全省去第一个深度写入过程和纹理访问。

相关问题