2012-11-23 2 views
1

쉐이더에서 이전에 렌더링 된 화면의 내용이 인 인 특수 변수가 이미 있습니다. 그것은GLSL 쉐이더에서 모델 - 화면 좌표 혼동

uniform sampler2D _GrabTexture; 

에 저장됩니다에게 그것의 어떤 내용이어야한다 : Screen content

(I 전체 화면을 얻을 또한 유니티의 GUI를 무시하세요} 유니티의 GrabPass {사용하고 보조 노트로.)

이제 내 비행기 모델의 텍스처로 _GrabTexture를 사용하여 패스를 번 더 렌더링 할 수 있습니다. 결과는 내 _GrabTexture와 완전히 동일합니까?

(요점은 나는 비행기의 질감 이제 양식 그래서 전에 한 번 더 패스 렌더링 해당 화면의 질감에 등, 선명, 흐림과 같은 몇 가지 효과를 적용 할 수있다.)

내가 마지막이 노력하고있어 패스. 변수는 Vertex & Fragment Shader에서 선언됩니다.

uniform sampler2D _GrabTexture; 
varying vec4 v_Position; 

버텍스 쉐이더 :

void main() 
     { 
      gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
      v_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 

     } 

스토어 화면이 조각 셰이더에 사용되는, 다양한 각 모델의 꼭지점의 좌표입니다.

조각 쉐이더 :

void main() 
     { 
      gl_FragColor = texture2D(_GrabTexture,vec2(v_Position)); 
     } 

지금 _GrabTexture 화면 질감에 액세스하는 것을 저장된 다양한 위치를 사용합니다. 전체 화면이므로 이미 화면 좌표에있는 내 v_Position에 올바른 픽셀이 올바르게 있어야합니다. 당신은 비행기의 질감이 보여주는 이전에 렌더링 화면 '의 종류'하지만 좌표를 잘 작성하지 볼 수 있듯이

는하지만 결과는

enter image description here

입니다. 결과가 첫 번째 이미지와 동일하도록 수정하려면 어떻게해야합니까?

답변

4

당신은 너무 복잡하다고 생각합니다. OpenGL은 변수 gl_FragCoord에 내장 된 프래그먼트 쉐이더에서 화면상의 프래그먼트 위치를 알려줍니다.

GLSL-1.30 이상을 사용하는 경우 texelFetch을 사용하면 소스 좌표로 gl_FragCoord을 직접 입력 할 수 있습니다. 또는 gl_FragCoord를 텍스처 공간 좌표로 변환하는 방법을 참조하십시오. https://stackoverflow.com/a/5879551/524368

+0

감사합니다. Unity의 GLSL에서 texelFetch를 지원하지 않기 때문에 전환이 발생합니다. (나는 또한'gl_FragCoord'를 안다. 그러나 그것이 내 마음을 어떻게 미끄러 뜨렸는지 궁금해했다.) 그러나 단점은 쉐이더 코드에서 런타임시'sampler2D'의 너비와 높이를 알 수 없어 내 스크린에 따라 설정해야한다는 것이다. – 5argon

+0

@Sargon : 제복을 사용하여 텍스처 크기를 추가 vec2로 전달합니다. – datenwolf