2012-12-31 3 views
0

다른 쉐이더 스테이지 사이의 수학을 이해하는 데 어려움이 있습니다. 난 기본적으로 색상shadowmapping opengl glsl shader graphics math

#version 330 

out vec4 shader_fragmentColor; 

void main() 
{ 
    shader_fragmentColor = vec4(gl_FragCoord.z, gl_FragCoord.z, gl_FragCoord.z, 1); 
    //shader_fragmentColor = vec4(1, 0.5, 0.5, 1); 
} 

은 모두 화이트 색상의 장면을 표시 위의 쉐이더를 사용하여 장면을 렌더링 RGB하는 fragDepth을 작성하는 등의 관점에서 프레 그먼트 쉐이더에서

. gl_FragCoord.z가 1보다 큽니다. 왜냐하면 잘하면 1에서 끝나지 않았지만 지금은 그 질문을 남겨 둘 수 있습니다.

카메라의 관점에서 보았을 때 기본적으로 모든 점을 쿼드로 바꾸고 lightTexture에서 룩업 할 가능성이있는 "잘못된"텍스처 위치를 씁니다. 여기에 수학이 질문입니다. 보간 값이 다음 쉐이더 단계에서 정확할 지에 대해서는 약간 확신 할 수 없습니다. 내가 조명 perspecive과 동일한 색상을 쓰기로 표시 될지 색입니다 lightTexture에 조회 basicly 카메라의 관점에서 프래그먼트 쉐이더

#version 330 
#extension GL_EXT_geometry_shader4 : enable 

uniform mat4 p1_modelM; 
uniform mat4 p1_cameraPV; 
uniform mat4 p1_lightPV; 

out vec4 shader_lightTexturePosition; 

void main() 
{ 
    float s = 10.00; 

    vec4 llCorner = vec4(-s, -s, 0.0, 0.0); 
    vec4 llWorldPosition = ((p1_modelM * llCorner) + gl_in[0].gl_Position); 
    gl_Position = p1_cameraPV * llWorldPosition; 
    shader_lightTexturePosition = p1_lightPV * llWorldPosition; 
    EmitVertex(); 

    vec4 rlCorner = vec4(+s, -s, 0.0, 0.0); 
    vec4 rlWorldPosition = ((p1_modelM * rlCorner) + gl_in[0].gl_Position); 
    gl_Position = p1_cameraPV * rlWorldPosition; 
    shader_lightTexturePosition = p1_lightPV * rlWorldPosition; 
    EmitVertex(); 

    vec4 luCorner = vec4(-s, +s, 0.0, 0.0); 
    vec4 luWorldPosition = ((p1_modelM * luCorner) + gl_in[0].gl_Position); 
    gl_Position = p1_cameraPV * luWorldPosition; 
    shader_lightTexturePosition = p1_lightPV * luWorldPosition; 
    EmitVertex(); 

    vec4 ruCorner = vec4(+s, +s, 0.0, 0.0); 
    vec4 ruWorldPosition = ((p1_modelM * ruCorner) + gl_in[0].gl_Position); 
    gl_Position = p1_cameraPV * ruWorldPosition; 
    shader_lightTexturePosition = p1_lightPV * ruWorldPosition; 
    EmitVertex(); 

    EndPrimitive(); 
} 

.

카메라의 관점에서 렌더링 할 때 장면이 그려지는 것처럼 보이지만 반복되는 장면에 대해 잘못된 텍스처 좌표가 적용됩니다. 텍스쳐를 반복하는 것은 텍스처 좌표가 0에서 1의 경계를 벗어난 것에서 비롯된 것 같습니다.

여러 가지 시도를했지만 여전히 수학이 무엇인지 이해하지 못했습니다. 몇 가지 주석 처리 된 코드와 확실하지 않은 예는 다음과 같습니다.

shader_lightTexturePosition = normalize(p1_lightPV * llWorldPosition)/2 + vec4(0.5, 0.5, 0.5, 0.5); 

왼쪽 하단 모서리입니다. 다른 모서리에 similair 코드

솔루션에서 나는 장면이 조명 관점에서와 정확히 같은 색상으로 카메라의 관점에서 렌더링 될 것으로 기대합니다. 아마도 약간의 정밀 오차가있을 수 있습니다.

답변

0

저는 텍스처 매핑 비트를 직접 알아 냈습니다. 심도 값 비트는 여전히 약간 이상합니다. screenProjectedCoords를 normalizedDeviceCoords로 변환 한 다음 1을 2로 나눕니다.

vec4 textureNormalizedCoords(vec4 screenProjected) 
{ 
    vec3 normalizedDeviceCoords = (screenProjected.xyz/screenProjected.w); 
    return vec4((normalizedDeviceCoords.xy + 1.0)/2.0, screenProjected.z * 0.005, 1/screenProjected.w); 
} 

void main() 
{ 
    float s = 10.00; 

    vec4 llCorner = vec4(-s, -s, 0.0, 0.0); 
    vec4 llWorldPosition = ((p1_modelM * llCorner) + gl_in[0].gl_Position); 
    gl_Position = p1_cameraPV * llWorldPosition; 
    shader_lightTextureCoords = textureNormalizedCoords(p1_lightPV * llWorldPosition); 
    EmitVertex();a