Fau*_*ult 4 opengl glsl texture-mapping vertex-shader
我想要完成的是:在我的场景顶部绘制我的场景的深度图(以便更近的物体更暗,更远的物体更亮)
问题:我似乎不明白如何将正确的纹理坐标从我的顶点着色器传递到我的片段着色器。
所以我创建了我的 FBO,以及深度贴图被绘制到的纹理......不是我完全确定我在做什么,但无论如何,它有效。我测试使用固定功能管道绘制纹理,它看起来就像它应该的(深度图)。
但是试图在我的着色器中使用它是行不通的......
这是我的渲染方法中绑定纹理的部分:
glActiveTexture(GL_TEXTURE7);
glBindTexture(GL_TEXTURE_2D, depthTextureId);
glUniform1i(depthMapUniform, 7);
glUseProgram(shaderProgram);
look(); //updates my viewing matrix
box.render(); //renders box VBO
Run Code Online (Sandbox Code Playgroud)
所以……我觉得这样对吗?也许?不知道为什么纹理 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.
}
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
现在的问题是片段着色器接收到的纹理坐标始终是 (0,0),或左下角。我尝试将其更改为 ShadowCoord = gl_MultiTexCoord7,因为我认为这可能与我将纹理放在插槽号 7 中有关……但唉,问题仍然存在。当 (0, 0) 的颜色发生变化时,整个场景的颜色也会发生变化,而不仅仅是相应像素/片段的颜色变化。
这就是我希望了解的内容……如何传递正确的坐标(我希望纹理的角与屏幕角的坐标相同)。是的,这是一个初学者问题......但我一直在查看橙皮书,问题在于它在 GLSL 方面很棒,但是在示例中严重缺乏 OpenGL 方面的问题我真的可以用...
输入变量gl_MultiTexCoord0(或 7)是第 0(或第 7)个纹理坐标的内置每顶点纹理坐标,由gl(Multi)TexCoord(使用立即模式时)或由glTexCoordPointer(使用数组/VBO 时)设置。
但是由于您的深度缓冲区已经在屏幕空间中,您想要的不是放置在对象上的普通纹理,而是特定像素/片段的纹理值。所以顶点着色器不以任何方式参与。相反,您只需使用当前片段的屏幕空间位置作为纹理坐标,可以在片段着色器中使用gl_FragCoord. 但请记住,该坐标在 [0,w]x[0,h] 中,纹理由 [0,1] 中的归一化纹理坐标访问。所以你必须将片段的坐标除以屏幕大小:
uniform vec2 screenSize;
...
... texture2D(ShadowMap, gl_FragCoord.st/screenSize) ...
Run Code Online (Sandbox Code Playgroud)
但实际上,无论如何您都不需要两次传递来实现此效果,因为您可以直接使用片段的深度,而无需将其写入纹理。代替
texture2D(ShadowMap, gl_FragCoord.st/screenSize).x
Run Code Online (Sandbox Code Playgroud)
你可以使用
gl_FragCoord.z
Run Code Online (Sandbox Code Playgroud)
这只不过是片段的深度值,它会在第一次通过时写入纹理。通过这种方式,您可以完全省去第一次深度写入和第二次中的纹理访问。
| 归档时间: |
|
| 查看次数: |
11079 次 |
| 最近记录: |