Opengl 无法生成阴影贴图

Opengl 无法生成阴影贴图,opengl,glsl,jogl,Opengl,Glsl,Jogl,我已经为阴影贴图苦苦挣扎了两天(使用JOGL),但仍然无法让它工作。现在我只想渲染一个非常简单的阴影贴图(草),从光点的角度看,越近越亮,越远越暗 这是我的密码: //setting up buffers gl.glGenFramebuffers(1, framebuff); gl.glBindFramebuffer(GL4.GL_FRAMEBUFFER, framebuff.get(0)); gl.glGenTextures(2, textureBuff); gl.glBindTexture

我已经为阴影贴图苦苦挣扎了两天(使用JOGL),但仍然无法让它工作。现在我只想渲染一个非常简单的阴影贴图(草),从光点的角度看,越近越亮,越远越暗

这是我的密码:

//setting up buffers
gl.glGenFramebuffers(1, framebuff);
gl.glBindFramebuffer(GL4.GL_FRAMEBUFFER, framebuff.get(0));

gl.glGenTextures(2, textureBuff);
gl.glBindTexture(GL4.GL_TEXTURE_2D, textureBuff.get(0));
gl.glTexStorage2D(GL4.GL_TEXTURE_2D, 1, GL4.GL_R32F, displayWidth, displayHeight);
gl.glTexParameteri(GL4.GL_TEXTURE_2D, GL4.GL_TEXTURE_MAG_FILTER, GL4.GL_LINEAR);
gl.glTexParameteri(GL4.GL_TEXTURE_2D, GL4.GL_TEXTURE_MIN_FILTER, GL4.GL_LINEAR_MIPMAP_LINEAR);
gl.glFramebufferTexture(GL4.GL_FRAMEBUFFER, GL4.GL_COLOR_ATTACHMENT0, textureBuff.get(0), 0);

gl.glBindTexture(GL4.GL_TEXTURE_2D, textureBuff.get(1));
gl.glTexStorage2D(GL4.GL_TEXTURE_2D, 1, GL4.GL_DEPTH_COMPONENT32F, displayWidth, displayHeight);
gl.glTexParameteri(GL4.GL_TEXTURE_2D, GL4.GL_TEXTURE_MAG_FILTER, GL4.GL_LINEAR);
gl.glTexParameteri(GL4.GL_TEXTURE_2D, GL4.GL_TEXTURE_MIN_FILTER, GL4.GL_LINEAR_MIPMAP_LINEAR);
gl.glTexParameteri(GL4.GL_TEXTURE_2D, GL4.GL_TEXTURE_COMPARE_MODE, GL4.GL_COMPARE_REF_TO_TEXTURE);
gl.glTexParameteri(GL4.GL_TEXTURE_2D, GL4.GL_TEXTURE_COMPARE_FUNC, GL4.GL_LEQUAL);
gl.glFramebufferTexture(GL4.GL_FRAMEBUFFER, GL4.GL_DEPTH_ATTACHMENT, textureBuff.get(1), 0);
gl.glDrawBuffer(GL4.GL_NONE);

if(gl.glCheckFramebufferStatus(GL4.GL_FRAMEBUFFER) != GL4.GL_FRAMEBUFFER_COMPLETE)
         System.out.println(gl.glCheckFramebufferStatus(GL4.GL_FRAMEBUFFER));
顶点着色器:

"#version 430                                       \n" + 
"layout (location = 3) uniform mat4 mvMatrix;       \n" + 
"layout (location = 4) uniform mat4 proMatrix;      \n" + 
"layout (location = 0) in vec4 position;            \n" + 
"                                                   \n" + 
"void main(void)                                    \n" + 
"{                                                  \n" + 
"   randomize position...                           \n" + 
"                                                   \n" + 
"   gl_Position = proMatrix * mvMatrix * position;  \n" + 
"}"
片段着色器代码:

"#version 430                                       \n" + 
"out vec4 output_color;                             \n" + 
"void main(void)                                    \n" + 
"{                                                  \n" + 
"   output_color = vec4(gl_FragCoord.z);            \n" + 
"}"
绘图命令(不确定是否正确):

增加: 当我对glBindFramebuffer()进行注释时,草以白色正确显示(从灯光的角度来看,这表明矩阵应该是正确的)。

但是,如果我在启用深度测试的情况下调用glBindFramebuffer(),所有内容都会消失,而我希望越近的草越亮,越远的草越暗。(还检查了帧缓冲区状态,没有问题)
有什么帮助吗?

修复了,一开始我不理解屏幕外渲染的含义。只需将存储在纹理中的深度值渲染到默认帧缓冲区中进行显示,一切都正常。真不敢相信我花了5天时间在这上面。

//gl.glBindFramebuffer(GL4.GL_FRAMEBUFFER, framebuff.get(0));
gl.glViewport(0, 0, displayWidth, displayWidth);
gl.glEnable(GL4.GL_POLYGON_OFFSET_FILL);
gl.glPolygonOffset(2.0f, 4.0f);

/*IntBuffer frameType = GLBuffers.newDirectIntBuffer(1);
frameType.put(GL4.GL_COLOR_ATTACHMENT0);
gl.glDrawBuffers(1, frameType);
gl.glClearBufferfv(GL4.GL_COLOR, 0, new float[] {0, 0, 0}, 0);
gl.glClearDepth(1.0f);*/

setupMVPMatrix();
gl.glBindVertexArray(vaoBuff.get(0));

gl.glUseProgram(shaderProgram);
gl.glDrawArraysInstanced(GL4.GL_TRIANGLE_STRIP, 0, 5, 512 * 512);

gl.glDisable(GL4.GL_POLYGON_OFFSET_FILL);
//gl.glBindFramebuffer(GL4.GL_FRAMEBUFFER, 0);
gl.glBindFramebuffer(GL4.GL_FRAMEBUFFER, framebuff.get(0));
draw scene...(storing the depth value into the depth texture)

gl.glBindFramebuffer(GL4.GL_FRAMEBUFFER, 0);
draw scene...(comparing with the depth texture stored)