기본 쉐도우 매핑 알고리즘을 구현했지만 하나의 라이트에서만 올바르게 작동합니다.GLSL을 사용하여 멀티 라이트 쉐도우 매핑이 올바르게 작동하지 않습니다.
나는 다음과 같은 두 가지 점 조명 장면을 렌더링 할 :
- Light_1 - 위치 : VEC3 (-8.0f, 5.0f, 8.0f)를, 방향 : VEC3 (1.3f, -1.0f, -1.0f)
- Light_2 - 위치 : VEC3 (8.0f, 5.0f, 8.0f), 방향 : VEC3은 (1.3f, -1.0f, -1.0f)
나는 별도로 두 개의 렌더링하는 경우 조명 다음과 같은 결과가 있습니다 :
Ligh로 렌더링 T_1 :
그러나 두 빛이 함께이 모양을 : 첫 번째 그림자를 볼 수 있듯이
올바르게 렌더링 된 것처럼 보이지만 light_2의 그림자 아래에 있습니다. ich가 정확하지 않습니다. 그 상황을 요약하면 텍스쳐 유닛 0에 묶여있는 상자의 텍스쳐가 있습니다. 그림자 깊이 텍스쳐는 텍스쳐 유닛 1에서 구속되어 있습니다. 그리고 깊이 텍스쳐가 두 개 이상 있다면 (적어도 두 개의 ligths처럼 이 예), 텍스처 유닛 1 + 1 (GL_TEXTURE1 + 1)에 바인딩됩니다.
그것은 우리의 경우에 해당for (int idy = 0; idy < this->m_pScene->getLightList().size(); idy++)
[...]
Light *light = this->m_pScene->getLightList()[idy];
FrameBuffer *frameBuffer = light->getFrameBuffer();
glActiveTexture(GL_TEXTURE1 + idy);
glBindTexture(GL_TEXTURE_2D, frameBuffer->getTexture()->getTextureId()); //To unbind
shaderProgram->setUniform(std::string("ShadowMatrix[").append(Convertor::toString<int> (idy)).append("]").c_str(), this->m_pScene->getLightList()[idy]->getBiasViewPerspectiveMatrix() * modelMatrix);
shaderProgram->setUniform(std::string("ShadowMap[").append(Convertor::toString<int>(idy)).append("]").c_str(), (int)idy + 1);
:
shaderProgram->setUniform("ShadowMatrix[0]", <shadow_matrix_light_1>);
shaderProgram->setUniform("ShadowMap[0]", 1); (GL_TEXTURE1)
shaderProgram->setUniform("ShadowMatrix[1]", <shadow_matrix_light_2>);
shaderProgram->setUniform("ShadowMap[1]", 2); (GL_TEXTURE2)
버텍스 쉐이더 (단 2 등 가능) 다음이다 :
#version 400
#define MAX_SHADOW_MATRIX 10
#define MAX_SHADOW_COORDS 10
layout (location = 0) in vec4 VertexPosition;
layout (location = 1) in vec3 VertexNormal;
layout (location = 2) in vec2 VertexTexture;
uniform mat3 NormalMatrix;
uniform mat4 ModelViewMatrix;
uniform mat4 ShadowMatrix[MAX_SHADOW_MATRIX];
uniform mat4 MVP;
uniform int lightCount;
out vec3 Position;
out vec3 Normal;
out vec2 TexCoords;
out vec4 ShadowCoords[MAX_SHADOW_COORDS];
void main(void)
{
TexCoords = VertexTexture;
Normal = normalize(NormalMatrix * VertexNormal);
Position = vec3(ModelViewMatrix * VertexPosition);
for (int idx = 0; idx < lightCount; idx++)
ShadowCoords[idx] = ShadowMatrix[idx] * VertexPosition;
gl_Position = MVP * VertexPosition;
}
여기에 내가 말한 무엇을 나타내는 코드입니다
그리고 프래그먼트 셰이더의 코드 조각 :
separatly 두 그림자가 완벽하게 렌더링되었고 glActiveTexture를 올바르게 사용했기 때문에 질감 단위 문제와 유사합니다 (나는 그렇게 생각합니다). 또한, 조명의로드 순서를 변경하면 나쁜 그림자는 '다른 빛'(반대의 경우)에 의해 발생한다는 것을 알았습니다. 그래서 텍스처 유닛 2에서 오는 것 같습니다. 그러나 나는 왜 그런지 이해하지 못합니다. 누구든지 나를 도와 줄 수 있니? 도와 주셔서 미리 감사드립니다.
OpenGL 지식을 OpenGL 4로 업데이트 할 시간이 있었으면 좋겠습니다. – Shahbaz
'vec4 (VertexPosition, 1.0f)'을 계속 쓰지 않아도됩니다. 먼저 VertexPosition을'vec4 '로 선언하면됩니다. GLSL은'glVertexAttribPointer (...)'호출이 XYZ를위한 충분한 데이터만을 제공한다면'W'에 ** 1.0 **을 자동으로 채 웁니다. 또한 당신이'idy '를 문자로 변환하고 문자열을 만드는 복잡한 일 (예 : "ShadowCoords ["idy "]")은 불필요합니다. - ShadowCoords에 대한 동일한 위치를 얻은 다음 추가하십시오 'idy'를 유니폼 배열의 각 요소가 순차적 인 위치에 할당 될 것이기 때문에 그 값을 사용하십시오. –
감사합니다. 어드바이스에 따라 위의 버텍스 쉐이더 코드를 업데이트했습니다 (나는 당신의 의견에 동의합니다.). 그러나 두 번째 조언은 매우 흥미롭고 ShadowCoords에 적용되었습니다. 하지만 'LightInfos ['idy ']. position'과 같은 구조로 적용 할 수 있습니까? 미리 감사드립니다. – user1364743