Shadow Map(單方向)

 

 

  很早就想看陰影映射,一直拖到了如今,今天終於看了單方向的陰影映射,而後搭了個場景看了一下效果(每次搭場景感受有點麻煩)。ui

  陰影映射的大致過程:this

// 1. 首選渲染深度貼圖
glViewport(0, 0, SHADOW_WIDTH, SHADOW_HEIGHT);
glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO);
    glClear(GL_DEPTH_BUFFER_BIT);
    ConfigureShaderAndMatrices();
    RenderScene();
glBindFramebuffer(GL_FRAMEBUFFER, 0);
// 2. 像往常同樣渲染場景,但此次使用深度貼圖
glViewport(0, 0, SCR_WIDTH, SCR_HEIGHT);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
ConfigureShaderAndMatrices();
glBindTexture(GL_TEXTURE_2D, depthMap);
RenderScene();

  思路:spa

  一、渲染深度貼圖code

  以光源的位置爲相機位置進行一遍渲染,固然了得使用GBuffer(延遲着色)進行離屏渲染,這樣能夠將深度存入一張紋理。以後能夠經過平面貼圖的方式展現深度貼圖的模樣,方便檢驗深度貼圖的正確性。blog

        

 

  二、渲染陰影class

  這一步和正常渲染同樣,只是要加入深度判斷。對於當前的片元,將其位置轉換到光源的視圖下的座標,這樣能夠從深度圖中採樣對應其的深度貼圖中的座標,深度貼圖中表示對應片元射線下的最近片元的深度值,將當前的片元的深度值與從depth texture中採樣的深度值進行比較,大於採樣的深度值則表示片元位於陰影中。渲染

  

  看起來有點不對,深度紋理採用了循環採樣的設置,一些不應有陰影的地方出現了陰影。更改深度紋理的屬性設置。循環

GLuint WKS::Texture::GenDepthTexture(GLuint width, GLuint height) {
    glGenTextures(1, &this->textureID);
    glBindTexture(GL_TEXTURE_2D, this->textureID);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
    GLfloat borderColor[] = { 1.0, 1.0, 1.0, 1.0 };
    glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
    glBindTexture(GL_TEXTURE_2D, 0);
    return this->textureID;
}

  

  好多了。float

  固然了,這樣的陰影範圍有限,要獲取完整的陰影須要使用點陰影的方式,對六個方向獲取深度紋理。(見下節)im

相關文章
相關標籤/搜索