2013-01-31 97 views
6

我試圖在我們的遊戲項目中實現陰影映射。我用兩遍渲染來渲染紋理技術。我已經創建了一個FBO,並僅爲深度組件綁定了紋理。在第一遍中,我啓用此FBO,禁用紋理並從光線POV渲染我的場景。在第二遍中,我將深度紋理傳遞給着色器並正常渲染場景。我在着色器中執行與陰影相關的計算。FBO中的OpenGL陰影映射 - 多拖尾繪製

但是,我的代碼無法正常工作。我無法看到任何影子。另外,當我渲染兩個通道時,如果我的相機看上去超過某個角度,我會看到整個世界的一個接一個的多個圖形:45。如果我看下面的角度,渲染看起來很好。什麼可能是這個問題的根源? 。如果我禁用第一次傳球,那麼世界看起來會更暗,但最後的場景消失了。我還附上了我的代碼。

Multiple Drawing

我也有另一種混亂。我禁用了第一個陰影貼圖傳遞的紋理。但是我將紋理座標與我的頂點座標一起發送給VBO。會造成什麼問題嗎?

FBO初始化

LightPosition = glm::vec3(50.0f, 40.0f, 50.0f); 
upVector = glm::vec3(0.0f, 1.0f, 0.0f); 

glGenTextures(1, &m_shadowMap); 
glBindTexture(GL_TEXTURE_2D, m_shadowMap); 
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); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); 
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, 
     WindowWidth, WindowHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); 
glBindTexture(GL_TEXTURE_2D, 0); 

glGenFramebuffers(1, &m_fbo); 
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo); 
glDrawBuffers(0, NULL); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_shadowMap, 0); 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 

glEnable(GL_DEPTH_TEST); 
glEnable(GL_CULL_FACE); 


GLenum Status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 

if (Status != GL_FRAMEBUFFER_COMPLETE) { 
    printf("FB error, status: 0x%x\n", Status); 
    return false; 
} 

return true; 

陰影貼圖通行證:

glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, 0); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, 0); 


glViewport(0, 0, windowWidth, windowHeight); 

glBindFramebuffer(GL_FRAMEBUFFER, shadowMapFBO.m_fbo); 

glClear(GL_DEPTH_BUFFER_BIT); 


glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glm::mat4 lightProjection = glm::perspective(45.0f, 
     1.0f * windowWidth/windowHeight, 0.125f, 1000.0f); 
glGetFloatv(GL_PROJECTION_MATRIX, shadowMapFBO.LightProjectionMatrix); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glm::mat4 lightModelView = glm::lookAt(shadowMapFBO.LightPosition, 
     glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f)); 
glGetFloatv(GL_MODELVIEW_MATRIX, shadowMapFBO.LightModelViewMatrix); 

glm::mat4 lmvp = lightProjection * lightModelView; 

glCullFace(GL_FRONT); 

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
glDisable(GL_LIGHTING); 
glDisable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, 0); 

glUniform1i(Shader::id_uniform_layer, 0); 
world->render(lmvp); 
printGLError(); 


glBindFramebuffer(GL_FRAMEBUFFER, 0); 

渲染通行證:

static glm::vec3 cCameraPosition = glm::vec3(0.0f, 5.0f, 10.0f); 
static glm::vec3 cLightPosition = glm::vec3(50.0f, 40.0f, 50.0f); 

glBindFramebuffer(GL_FRAMEBUFFER, 0); 
glViewport(0, 0, windowWidth, windowHeight); 

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glm::mat4 modelView = player->getView(); 

float viewAngle = 45.0f; 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glm::mat4 projection = glm::perspective(viewAngle, 
     1.0f * windowWidth/windowHeight, 0.01f, 1000.0f); 
glm::mat4 mvp = projection * modelView; 


glEnable(GL_TEXTURE_2D); 

glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, shadowMapFBO.m_shadowMap); 

glMatrixMode(GL_TEXTURE); 
glLoadIdentity(); 
glTranslatef(0.5f, 0.5f, 0.5f); 
glScalef(0.5f, 0.5f, 0.5f); 
glMultMatrixf(shadowMapFBO.LightProjectionMatrix); 
glMultMatrixf(shadowMapFBO.LightModelViewMatrix); 

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, id_texture_blocks); 

glUseProgram(Shader::id_program); 

glUniform3fv(Shader::id_uniform_lightPosition, 1, 
     glm::value_ptr(cLightPosition)); 
glUniform3fv(Shader::id_uniform_CameraPosition, 1, 
     glm::value_ptr(*(player->getCoordinates()))); 

//Enabling color write (previously disabled for light POV z-buffer rendering) 
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
glUniform1i(Shader::id_shader_shadow, 1); 

glUniformMatrix4fv(Shader::id_uniform_mvp, 1, GL_FALSE, glm::value_ptr(mvp)); 

glEnable(GL_POLYGON_OFFSET_FILL); 
glEnable(GL_CULL_FACE); 

glCullFace(GL_BACK); 

glUniform1i(Shader::id_uniform_layer, 0); 
world->render(mvp); 
printGLError(); 

頂點着色器:

attribute vec4 coordinates; 
uniform mat4 mvp; 

//Fragment shader forward variables. 
varying vec4 voxel; 

//shadow map 
// Used for shadow lookup 
varying vec4 ShadowCoord; 

uniform vec3 LightPosition, CameraPosition; 

varying vec3 LightDirection, LightDirectionReflected, CameraDirection, Normal; 

void main(void) { 

//shadow map 
LightDirection = LightPosition - gl_Vertex.xyz; 
LightDirectionReflected = reflect(-LightDirection, gl_Normal); 
CameraDirection = CameraPosition - gl_Vertex.xyz; 
Normal = gl_Normal; 
gl_TexCoord[0] = gl_MultiTexCoord0; 
gl_TexCoord[1] = gl_TextureMatrix[1] * gl_Vertex; 

voxel = coordinates; 
//Calculates projection on xyz. 
gl_Position = mvp * vec4(coordinates.xyz, 1); 
} 

片段着色器:

#extension GL_EXT_gpu_shader4 : enable 


//Rendering layer. 
uniform int layer; 


//Colors. 
uniform float colorRed; 
uniform float colorGreen; 
uniform float colorBlue; 
uniform float colorAlpha; 

//Fog density. 
uniform float fogDensity; 

varying vec4 voxel; 

uniform sampler2D texture; 

const float N_TEXTURES = 32.0; 

//////////////////////shadow map 
uniform sampler2DShadow ShadowMap; 

varying vec4 ShadowCoord; 

varying vec3 LightDirection, LightDirectionReflected, CameraDirection, Normal; 

void main(void) { 

vec2 coord2d; 
float intensity; 

vec4 color = texture2D(texture, coord2d); 

float z = gl_FragCoord.z/gl_FragCoord.w; 
float fog = clamp(exp(-fogDensity * z * z), 0.2, 1.0); 

color.xyz = color.xyz * intensity; 

//shadow map 
float Shadow = shadow2DProj(ShadowMap, gl_TexCoord[1]).r; 

float NdotLD = max(dot(normalize(LightDirection), Normal), 0.0) * Shadow; 
float Spec = pow(max(dot(normalize(LightDirectionReflected), normalize(CameraDirection)), 0.0), 32.0) * Shadow; 
color.xyz = color.xyz * (0.25 + NdotLD * 0.75 + Spec); 

//Final color. 
vec4 fogColor = vec4(colorRed, colorGreen, colorBlue, colorAlpha); 
gl_FragColor = mix(fogColor, color, fog); 


} 
+0

你的#版本指令在哪裏? – genpfault

+0

該版本已在着色器生成代碼中定義。它的價值是1.20(通過聲明 - #版本120 \ n)。 – user2028566

回答

1

一瞥,它看起來像你不使用glClear所以天空是無論是在最後一幀,或至少它不工作。什麼是glClearColor的alpha值?