2013-05-07 7 views
2

문제를 좀 더 자세하게 정의하기 전에 모든 것을 어떻게 설정했는지 설명해야합니다.AGAL : 프래그먼트 셰이더에서 화면 공간 위치 계산

_vertices = Vector.<Number>([ 
    -1, -1, 0, 0, 0, 
    1, -1, 0, 1, 0, 
    1, 1, 0, 1, 1, 
    -1, 1, 0, 0, 1 
]); 

_indices = Vector.<uint>([ 
    0, 2, 1, 
    0, 3, 2 
]); 

아무것도 공상 여기서 않을 :

기본적 I는 (X, Y, Z, U는 V)로 정의 단순한 평면 메쉬를 갖는다. 그러나, 내가 이것을 렌더링하는 방법은 모든 것이 떨어지는 곳입니다. 두 개의 렌더링 패스를 사용하여 렌더링됩니다. 첫 번째는 단순히 출력에 색상을 복사하고 512x512 텍스처로 렌더링하는 단순한 조각 쉐이더입니다. 그래도 모든 것이 잘 작동합니다. 두 번째 렌더링 패스에 문제가 있습니다.

두 번째 최종 렌더링 패스는 동일한 지오메트리를 렌더링하지만 첫 번째 패스에서 렌더링 된 텍스처에서 fragmen (픽셀)의 색상을 가져와야합니다. 그게 내 문제가 어디서 오는지, 제대로 화면 공간 좌표 또는 UV 좌표에서 현재 픽셀의 위치를 ​​정확하게 계산하는 방법이 필요하므로 정확하게 텍스처에서 추출 할 수 있습니다.

나는이 위치를 계산하는 방법에 대한 연구를 해왔지만 어떻게 든 만화경과 같은 효과를 만들어 냈습니다. Y 축선을 X 또는 Z 축 메쉬 회전 아닌 경우 다음과 같이이 효과는, 그러나, 오직 명백한

Rotation comparisons

번째 패스에 사용되는 단편 프로그램이 생성 한 효과 모양은 다음과 같습니다.

div ft0.x, v0.x, v0.w // Divide vertex positions (v0.xy) with clip-space position (v0.w) 
div ft0.y, v0.y, v0.w // to obtain screen coordinates as -1,1 

mul ft0.x, ft0.x, fc0.x // Multiply positions (ft0.xy) by 0.5 (fc0.x) 
mul ft0.y, ft0.y, fc0.x 

add ft0.x, ft0.x, fc0.x // Finally add 0.5 (fc0.x) to positions (ft0.xy) 
add ft0.y, ft0.y, fc0.x 

tex ft1, ft0.xy, fs0 <2d, nearest, repeat, nomip> // Simply copy the pixel at (ft0) from the render buffer (fs0) 
mov oc, ft1"; 

마지막으로, 저는이 모든 것에 매우 익숙합니다. 그래서 나는 명백한 무언가를 놓치고 있을지도 모른다. 그리고 그런 것에 따라 나는 사전에 사과한다.

그리고 코드가 존재하지 않는 영광을보고 싶다면 Github 레포는 here입니다.

답변

2

PIX를 사용하여 단편 셰이더로 전달 된 Y 위치가 일반 플래시 좌표와 비교하여 반전된다는 것을 알았습니다. 화면의 상단이 1, 바닥이 -1 인 경우. 화면 위치 계산을하기 전에 Y 값을 간단히 무효화함으로써 이제는 완벽하게 작동합니다. 나는 이것이 내 측면의 소프트웨어 또는 하드웨어 이슈인지 또는 다른 곳에서 발견되었지만 적어도 작동한다는 것을 확신하지 못한다!