Я использовал этот код, чтобы нарисовать тени, но они вообще не появляются, и они не отображаются на квадроцикле, когда я хочу увидеть квадроцикл на экране, он появляется белый экран. Вы знаете, в чем может быть проблема? < /P>
Вот соответствующие части моей реализации: < /p>
float leftPlane = -40.0f;
float rightPlane = 40.0f;
float bottomPlane = -40.0f;
float topPlane = 40.0f;
float nearPlane = 0.1f;
float farPlane = 80.0f;
void initFBO() {
glGenFramebuffers(1, &shadowMapFBO);
glGenTextures(1, &depthMapTexture);
glBindTexture(GL_TEXTURE_2D, depthMapTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, SHADOW_WIDTH, SHADOW_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);
float borderColor[] = { 1.0f, 1.0f, 1.0f, 1.0f };
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glBindFramebuffer(GL_FRAMEBUFFER, shadowMapFBO);
glCheckFramebufferStatus(GL_FRAMEBUFFER);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthMapTexture, 0);
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
glm::mat4 computeLightSpaceTrMatrix() {
glm::mat4 lightView = glm::lookAt(lightDir, glm::vec3(0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
glm::mat4 lightProjection = glm::ortho(leftPlane, rightPlane, bottomPlane, topPlane, nearPlane, farPlane);
glm::mat4 lightSpaceTrMatrix = lightProjection * lightView;
return lightSpaceTrMatrix;
}
//the projection matrix
projection = glm::perspective(glm::radians(45.0f), (float)glWindowWidth / (float)glWindowHeight, 0.1f, 1000.0f);
projectionLoc = glGetUniformLocation(myBasicShader.shaderProgram, "projection");
glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection));
void renderObj(gps::Shader shader, bool depthPass) {
shader.useShaderProgram();
glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
Object.Draw(shader);
if (!depthPass) {
normalMatrix = glm::mat3(glm::inverseTranspose(view * model));
glUniformMatrix3fv(normalMatrixLoc, 1, GL_FALSE, glm::value_ptr(normalMatrix));
}
}
void renderScene() {
depthMapShader.useShaderProgram();
glUniformMatrix4fv(glGetUniformLocation(depthMapShader.shaderProgram, "lightSpaceTrMatrix"), 1, GL_FALSE, glm::value_ptr(computeLightSpaceTrMatrix()));
glViewport(0, 0, SHADOW_WIDTH, SHADOW_HEIGHT);
glBindFramebuffer(GL_FRAMEBUFFER, shadowMapFBO);
glClear(GL_DEPTH_BUFFER_BIT);
renderObj(depthMapShader, true);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
if (showDepthMap) {
glViewport(0, 0, glWindowWidth, glWindowHeight);
glClear(GL_COLOR_BUFFER_BIT);
screenQuadShader.useShaderProgram();
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, depthMapTexture);
glUniform1i(glGetUniformLocation(screenQuadShader.shaderProgram, "depthMap"), 0);
glDisable(GL_DEPTH_TEST);
screenQuad.Draw(screenQuadShader);
glEnable(GL_DEPTH_TEST);
} else {
glViewport(0, 0, glWindowWidth, glWindowHeight);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
myBasicShader.useShaderProgram();
view = myCamera.getViewMatrix();
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_2D, depthMapTexture);
glUniform1i(glGetUniformLocation(myBasicShader.shaderProgram, "shadowMap"), 3);
glUniform1i(glGetUniformLocation(myBasicShader.shaderProgram, "fog"), fog);
updateLights();
glUniformMatrix4fv(glGetUniformLocation(myBasicShader.shaderProgram, "lightSpaceTrMatrix"), 1, GL_FALSE, glm::value_ptr(computeLightSpaceTrMatrix()));
renderObj(myBasicShader, false);
}
}
< /code>
фрагментный шейдер: < /p>
float computeShadow() {
vec3 normalizedCoords = fragPosLightSpace.xyz / fragPosLightSpace.w;
normalizedCoords = normalizedCoords * 0.5 + 0.5;
float closestDepth = texture(shadowMap, normalizedCoords.xy).r;
float currentDepth = normalizedCoords.z;
float bias = 0.005f;
float shadow = currentDepth > closestDepth ? 1.0f : 0.0f;
return shadow;
}
//in main:
float shadow = computeShadow();
vec3 color;
color = min((ambient + (1.0f - shadow) * diffuse) * texture(diffuseTexture, fTexCoords).rgb + (1.0f - shadow) * specular * texture(specularTexture, fTexCoords).rgb, 1.0f);
< /code>
Vertex Shader для глубины карты < /p>
#version 410 core
layout(location=0) in vec3 vPosition;
uniform mat4 lightSpaceTrMatrix;
uniform mat4 model;
void main() {
gl_Position = lightSpaceTrMatrix * model * vec4(vPosition, 1.0f);
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... -the-scene
Тени не отображаются на квадроцикле и не отображаются на сцене ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение