Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 阴影贴图:如何从第一个过程生成纹理(渲染到深度帧缓冲区)?_C++_Opengl_Glsl_Framebuffer_Shadow Mapping - Fatal编程技术网

C++ 阴影贴图:如何从第一个过程生成纹理(渲染到深度帧缓冲区)?

C++ 阴影贴图:如何从第一个过程生成纹理(渲染到深度帧缓冲区)?,c++,opengl,glsl,framebuffer,shadow-mapping,C++,Opengl,Glsl,Framebuffer,Shadow Mapping,我正在生成一个带有平行光的简单场景。我的目标是通过阴影贴图创建场景的阴影。在这个问题上,我到处寻找帮助,但都无济于事。据我所知,我的代码应该与我在多个教程中看到的代码相同 场景创建得非常完美,只是没有阴影。我怀疑这是程序第一次渲染过程中生成(或未生成)的阴影贴图纹理的问题。当我将渲染纹理绘制到四边形时,四边形是全白色的 我的缓冲区/纹理初始化代码如下所示: void Renderer :: initBuffers() { glGenTextures(1, &SMDepthTexture)

我正在生成一个带有平行光的简单场景。我的目标是通过阴影贴图创建场景的阴影。在这个问题上,我到处寻找帮助,但都无济于事。据我所知,我的代码应该与我在多个教程中看到的代码相同

场景创建得非常完美,只是没有阴影。我怀疑这是程序第一次渲染过程中生成(或未生成)的阴影贴图纹理的问题。当我将渲染纹理绘制到四边形时,四边形是全白色的

我的缓冲区/纹理初始化代码如下所示:

void Renderer :: initBuffers()
{
glGenTextures(1, &SMDepthTexture);
glBindTexture(GL_TEXTURE_2D, SMDepthTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE );
glTexParameteri( GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE );
glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);

glBindTexture(GL_TEXTURE_2D, 0);
/*
glGenRenderbuffers(1, &SMRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, SMRenderBuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, SMRenderBuffer);
*/

glGenFramebuffers(1, &SMFrameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, SMFrameBuffer);
glDrawBuffer(GL_NONE); // No color buffer is drawn to.
glReadBuffer(GL_NONE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, SMDepthTexture, 0);


// Always check that our framebuffer is ok
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
{
    std :: cerr << "Frame Buffer Status: " << glCheckFramebufferStatusEXT(GL_FRAMEBUFFER) <<"\n";
    exit(0);
}

glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
最后,我尝试使用以下功能将纹理绘制到屏幕填充四边形:

void Renderer :: drawMap()
{
Renderer :: camera_modelview = Globals::camera.getInverseCM();
Renderer :: light_modelview = Renderer :: light_cam.getInverseCM();
if(pass == 1)
{
    glLoadMatrixd(Renderer :: light_cam.getInverseCMGLPointer());
    //glUniformMatrix4fv(Renderer :: camera_modelview_handle_pass1, 1, false, Renderer :: camera_modelview.getGLfloatPointer());
    //glUniformMatrix4fv(Renderer :: light_modelview_handle_pass1, 1, false, Renderer :: light_modelview.getGLfloatPointer());
}
else if(pass == 2)
{
    glUniformMatrix4fv(Renderer :: camera_modelview_handle_pass2, 1, false, Renderer :: camera_modelview.getGLfloatPointer());
    glUniformMatrix4fv(Renderer :: light_modelview_handle_pass2, 1, false, Renderer :: light_modelview.getGLfloatPointer());
}
 glBindFramebuffer(GL_FRAMEBUFFER, 0);
 glUseProgram(0);
 glDisable(GL_LIGHTING);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 glOrtho(-width/2,width/2,-height/2,height/2,1,20);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 glColor4f(1,1,1,1);
 glActiveTexture(GL_TEXTURE0);
 glBindTexture(GL_TEXTURE_2D,Renderer :: SMDepthTexture);
 glEnable(GL_TEXTURE_2D);
 glTranslated(0,0,-1);
 glBegin(GL_QUADS);
 glTexCoord2d(0,0);glVertex3f(-width/2,-height/2,0);
 glTexCoord2d(1,0);glVertex3f(width/2,-height/2,0);
 glTexCoord2d(1,1);glVertex3f(width/2,height/2,0);
 glTexCoord2d(0,1);glVertex3f(-width/2,height/2,0);
 glEnd();
 glDisable(GL_TEXTURE_2D);
 glLoadIdentity();
 glEnable(GL_LIGHTING);
 }
我知道很多人都会遇到一个问题,那就是将相同的纹理同时绑定到帧缓冲区和活动纹理。我确信我已经避免了这种情况


如果需要更多细节,我将非常乐意发布更多代码(包括着色器)。我感谢你的帮助,所以提前谢谢你

glBindFramebuffer(GL\u FRAMEBUFFER,0)
void Renderer::drawMap()
intential?glBindFramebuffer*GL_FRAMEBUFFER,0);将当前帧缓冲区设置为标准的“绘制到屏幕”帧缓冲区。这是必要的,以绘制地图的屏幕。。。我想
void Renderer :: drawMap()
{
Renderer :: camera_modelview = Globals::camera.getInverseCM();
Renderer :: light_modelview = Renderer :: light_cam.getInverseCM();
if(pass == 1)
{
    glLoadMatrixd(Renderer :: light_cam.getInverseCMGLPointer());
    //glUniformMatrix4fv(Renderer :: camera_modelview_handle_pass1, 1, false, Renderer :: camera_modelview.getGLfloatPointer());
    //glUniformMatrix4fv(Renderer :: light_modelview_handle_pass1, 1, false, Renderer :: light_modelview.getGLfloatPointer());
}
else if(pass == 2)
{
    glUniformMatrix4fv(Renderer :: camera_modelview_handle_pass2, 1, false, Renderer :: camera_modelview.getGLfloatPointer());
    glUniformMatrix4fv(Renderer :: light_modelview_handle_pass2, 1, false, Renderer :: light_modelview.getGLfloatPointer());
}
 glBindFramebuffer(GL_FRAMEBUFFER, 0);
 glUseProgram(0);
 glDisable(GL_LIGHTING);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 glOrtho(-width/2,width/2,-height/2,height/2,1,20);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 glColor4f(1,1,1,1);
 glActiveTexture(GL_TEXTURE0);
 glBindTexture(GL_TEXTURE_2D,Renderer :: SMDepthTexture);
 glEnable(GL_TEXTURE_2D);
 glTranslated(0,0,-1);
 glBegin(GL_QUADS);
 glTexCoord2d(0,0);glVertex3f(-width/2,-height/2,0);
 glTexCoord2d(1,0);glVertex3f(width/2,-height/2,0);
 glTexCoord2d(1,1);glVertex3f(width/2,height/2,0);
 glTexCoord2d(0,1);glVertex3f(-width/2,height/2,0);
 glEnd();
 glDisable(GL_TEXTURE_2D);
 glLoadIdentity();
 glEnable(GL_LIGHTING);
 }