Anonymous
Ошибка отображения теней направленного света – opengl
Сообщение
Anonymous » 22 окт 2025, 05:41
Мне нужна помощь с отображением теней (направленного света) в opengl 3.3 и GLSL. Проблема в том, что тени на 3D-моделях и примитивах отображаются неправильно:
Это код, генерирующий матрицу теней из источника шейдеров:
Код: Выделить всё
void shadow::calculateShadowMatrixFromLightPointOfView(vector3f lightPosition, vector3f lightDirection)
{
//this method, only bind the frame buffer:
//glBindFramebuffer(GL_FRAMEBUFFER, uiFramebuffer);
fboShadowMap.bindFramebuffer();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//this method only bind the shader
m_shader.bindShader();
float rangeX = globalData::windowWidth;
float rangeY = globalData::windowHeight;
m_ProjectionMatrix = glm::ortho(-rangeX,rangeX,-rangeY,rangeY, 0.05f,400.0);
m_currentLigthPosition = glm::lookAt(
glm::vec3(lightPosition.x,lightPosition.y,lightPosition.z),
glm::vec3(
lightDirection.x,
lightDirection.y,
lightDirection.z
),
glm::vec3(0,1,0)
);
glm::mat4 biasMatrix(
0.5, 0.0, 0.0, 0.0,
0.0, 0.5, 0.0, 0.0,
0.0, 0.0, 0.5, 0.0,
0.5, 0.5, 0.5, 1.0
);
mDepthBiasMVP = biasMatrix * m_ProjectionMatrix * m_currentLigthPosition;
}
При этом создается буфер кадра:
Код: Выделить всё
bool frameBuffer::createFrameBufferWithTexture(int a_iWidth, int a_iHeight )
{
if(uiFramebuffer != 0)return false;
glGenFramebuffers(1, &uiFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, uiFramebuffer);
tFramebufferTex.createEmptyTexture(a_iWidth, a_iHeight, GL_RGB);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tFramebufferTex.getTextureID(), 0);
iWidth = a_iWidth;
iHeight = a_iHeight;
return glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE;
}
Целые числа a_iWidth и a_iHeight равны 1024.
Это создает текстуру:
Код: Выделить всё
unsigned int CTexture::createTexture(int w,int h,bool isDepth)
{
glGenTextures(1,&uiTexture);
glBindTexture(GL_TEXTURE_2D,uiTexture);
glTexImage2D(GL_TEXTURE_2D,0,(!isDepth ? GL_RGBA8 : GL_DEPTH_COMPONENT),w,h,0,(isDepth ? GL_DEPTH_COMPONENT : GL_RGBA),GL_FLOAT,NULL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
int i;
i=glGetError();
if(i!=0)
{
cout = 0.0 && ShadowMapTexCoordProj.y < 1.0 &&
ShadowMapTexCoordProj.z >= 0.0 && ShadowMapTexCoordProj.z < 1.0)
{
for (int i=0;icalculateShadowMatrixFromLightPointOfView(
dirLight->getPosition(),
dirLight->getDirection()
);
//render objects
glViewport(0, 0, globalData::windowWidth, globalData::windowHeight);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
//render objects
Я не знаю, в чем дело.
Подробнее здесь:
https://stackoverflow.com/questions/333 ... ror-opengl
1761100902
Anonymous
Мне нужна помощь с отображением теней (направленного света) в opengl 3.3 и GLSL. Проблема в том, что тени на 3D-моделях и примитивах отображаются неправильно: Это код, генерирующий матрицу теней из источника шейдеров: [code]void shadow::calculateShadowMatrixFromLightPointOfView(vector3f lightPosition, vector3f lightDirection) { //this method, only bind the frame buffer: //glBindFramebuffer(GL_FRAMEBUFFER, uiFramebuffer); fboShadowMap.bindFramebuffer(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //this method only bind the shader m_shader.bindShader(); float rangeX = globalData::windowWidth; float rangeY = globalData::windowHeight; m_ProjectionMatrix = glm::ortho(-rangeX,rangeX,-rangeY,rangeY, 0.05f,400.0); m_currentLigthPosition = glm::lookAt( glm::vec3(lightPosition.x,lightPosition.y,lightPosition.z), glm::vec3( lightDirection.x, lightDirection.y, lightDirection.z ), glm::vec3(0,1,0) ); glm::mat4 biasMatrix( 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.5, 0.5, 0.5, 1.0 ); mDepthBiasMVP = biasMatrix * m_ProjectionMatrix * m_currentLigthPosition; } [/code] При этом создается буфер кадра: [code]bool frameBuffer::createFrameBufferWithTexture(int a_iWidth, int a_iHeight ) { if(uiFramebuffer != 0)return false; glGenFramebuffers(1, &uiFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, uiFramebuffer); tFramebufferTex.createEmptyTexture(a_iWidth, a_iHeight, GL_RGB); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tFramebufferTex.getTextureID(), 0); iWidth = a_iWidth; iHeight = a_iHeight; return glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE; } [/code] Целые числа a_iWidth и a_iHeight равны 1024. Это создает текстуру: [code]unsigned int CTexture::createTexture(int w,int h,bool isDepth) { glGenTextures(1,&uiTexture); glBindTexture(GL_TEXTURE_2D,uiTexture); glTexImage2D(GL_TEXTURE_2D,0,(!isDepth ? GL_RGBA8 : GL_DEPTH_COMPONENT),w,h,0,(isDepth ? GL_DEPTH_COMPONENT : GL_RGBA),GL_FLOAT,NULL); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); int i; i=glGetError(); if(i!=0) { cout = 0.0 && ShadowMapTexCoordProj.y < 1.0 && ShadowMapTexCoordProj.z >= 0.0 && ShadowMapTexCoordProj.z < 1.0) { for (int i=0;icalculateShadowMatrixFromLightPointOfView( dirLight->getPosition(), dirLight->getDirection() ); //render objects glViewport(0, 0, globalData::windowWidth, globalData::windowHeight); glBindFramebuffer(GL_FRAMEBUFFER, 0); //render objects [/code] Я не знаю, в чем дело. Подробнее здесь: [url]https://stackoverflow.com/questions/33377106/directional-light-shadow-mapping-error-opengl[/url]