Java 将阴影贴图发送到OpenGL中的着色器

Java 将阴影贴图发送到OpenGL中的着色器,java,opengl,glsl,textures,shadow-mapping,Java,Opengl,Glsl,Textures,Shadow Mapping,我试图在场景中实现阴影贴图,但当我调用纹理()(我已经用==0.0对其进行了测试)时,我在片段着色器中得到的只是零。我的问题:我是否正确地将深度纹理发送到着色器 以下是我的片段着色器代码: bool getShadow() { vec4 lightProjPositionScaled = lightProjPosition/lightProjPosition.w; vec2 texCoords = lightProjPositionScaled.xy*0.5 + 0.5; //

我试图在场景中实现阴影贴图,但当我调用
纹理()
(我已经用
==0.0
对其进行了测试)时,我在片段着色器中得到的只是零。我的问题:我是否正确地将深度纹理发送到着色器

以下是我的片段着色器代码:

bool getShadow() {
    vec4 lightProjPositionScaled = lightProjPosition/lightProjPosition.w;
    vec2 texCoords = lightProjPositionScaled.xy*0.5 + 0.5;  // bias
    return lightProjPositionScaled.z + 0.0005 > texture(shadowMap, texCoords).x;
}
以下是我的相关java代码
Init(根据BDL的评论进行编辑)

显示(第一遍,用于阴影):

显示(第二遍,用于渲染场景):


另一个奇怪的结果是,只有
z=0
平面上相对于灯光矩阵(灯光旋转,平面随之旋转)的片段被点亮。灯光后面和前面的所有其他碎片都有阴影。

一个问题是线条
gl.glBindTexture(GL2.gl_纹理,阴影贴图);


我将纹理绑定到
GL\u纹理
而不是
GL\u纹理

您是否正在检查OpenGL错误?从第一种观点来看,至少有两种情况正在发生
GL_RENDERBUFFER
不是
glBindTexture
支持的目标。您从未将纹理附加到帧缓冲区(
glFramebufferTexture2D
),因此它很可能不完整。检查
glCheckFramebufferStatus
。啊,我切换到使用渲染缓冲区,然后切换回使用纹理。。使用
glCheckFramebufferStatus
时,我得到
GL\u FRAMEBUFFER\u complete\u MISSING\u ATTACHMENT
。是的,因为您从未附加深度纹理。。。在检查之前,您必须调用
glDrawBuffer(GL\u NONE)
,否则需要颜色附件。在检查之前,我确实调用了
glDrawBuffer(GL\u NONE)
。如何将深度纹理附加到帧缓冲区?使用
glFramebufferTexture2D
gl.glEnable(GL2.GL_TEXTURE_2D);

// generate stuff
IntBuffer ib = IntBuffer.allocate(1);
gl.glGenFramebuffers(1, ib);
frameBuffer = ib.get(0);

ib = IntBuffer.allocate(1);
gl.glGenTextures(1, ib);
shadowMap = ib.get(0);

gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, frameBuffer);
gl.glBindTexture(GL2.GL_TEXTURE, shadowMap);
gl.glTexImage2D(GL2.GL_TEXTURE_2D, 0, GL2.GL_DEPTH_COMPONENT, 1024, 1024, 0, GL2.GL_DEPTH_COMPONENT, GL2.GL_FLOAT, null);
gl.glDrawBuffer(GL2.GL_NONE);
gl.glReadBuffer(GL2.GL_NONE);
gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, 0);


// prevents 'shadow acne'
gl.glPolygonOffset(2.5f, 0);
// prevents multiple shadows
gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_WRAP_S, GL2.GL_CLAMP_TO_EDGE);
gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_WRAP_T, GL2.GL_CLAMP_TO_EDGE);
// prevents (or expects!!!) pixel-y textures
gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_NEAREST);
gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_NEAREST);
// store one value in all four components of pixel
gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_DEPTH_TEXTURE_MODE, GL2.GL_INTENSITY);
// render shadows
gl.glUseProgram(shadowProgram);

gl.glUniformMatrix4fv(lightMatrixLocShadow, 1, false, lightMatrix.getMatrix(), 0);  // yep (haha change viewMatrix -> lightMatrix)
gl.glUniformMatrix4fv(projMatrixLocShadow, 1, false, projMatrix.getMatrix(), 0);

gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, sha.frameBuffer);

gl.glViewport(0, 0, 1024, 1024);
gl.glClear(GL2.GL_DEPTH_BUFFER_BIT);
renderScene(gl, sunMatrix);
gl.glCopyTexImage2D(GL2.GL_TEXTURE_2D, 0, GL2.GL_DEPTH_COMPONENT, 0, 0, 1024, 1024, 0);
gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, 0);
// render display (regular)
gl.glUseProgram(displayProgram);
gl.glDrawBuffer(GL2.GL_FRONT);
gl.glReadBuffer(GL2.GL_FRONT);

gl.glUniformMatrix4fv(viewMatrixLoc, 1, false, viewMatrix.getMatrix(), 0);
gl.glUniformMatrix4fv(projMatrixLocDisplay, 1, false, projMatrix.getMatrix(), 0);
gl.glUniformMatrix4fv(lightMatrixLocDisplay, 1, false, lightMatrix.getMatrix(), 0);
gl.glUniform4fv(sunPositionLoc, 1, sunWorldPosition, 0);    // send sun's position to shader
gl.glUniform1f(sunBrightnessLoc, sunBrightness);
gl.glUniform1i(shadowMapLoc, 0);

gl.glViewport(0, 0, screenWidth, screenHeight);
// day-night cycle
float[] color = SkyManager.getSkyColor(time);
gl.glClearColor(color[0], color[1], color[2], 1);
gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
gl.glActiveTexture(GL2.GL_TEXTURE0);
gl.glBindTexture(GL2.GL_TEXTURE_2D, sha.shadowMap);
renderScene(gl, sunMatrix);