很早就想看陰影映射,一直拖到了現在,今天終于看了單方向的陰影映射,然后搭了個場景看了一下效果(每次搭場景感覺有點麻煩),
陰影映射的大體程序:
// 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();
思路:
1、渲染深度貼圖
以光源的位置為相機位置進行一遍渲染,當然了得使用GBuffer(延遲著色)進行離屏渲染,這樣可以將深度存入一張紋理,之后可以通過平面貼圖的方式展示深度貼圖的模樣,方便檢驗深度貼圖的正確性,

2、渲染陰影
這一步和正常渲染一樣,只是要加入深度判斷,對于當前的片元,將其位置轉換到光源的視圖下的坐標,這樣可以從深度圖中采樣對應其的深度貼圖中的坐標,深度貼圖中表示對應片元射線下的最近片元的深度值,將當前的片元的深度值與從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;}

好多了,
當然了,這樣的陰影范圍有限,要獲取完整的陰影需要使用點陰影的方式,對六個方向獲取深度紋理,(見下節)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/3813.html
標籤:其他
下一篇:DirectX:色彩基礎
