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