2011-02-23 7 views
1

현재 처리중인 조각 이외의 색상을 변경하려면 GLSL 조각 셰이더를 설정해야합니다. 그게 바람직하지 않을 수도 있기 때문에, 나는 아주 짧은 맥락을 제공 할 것이다.GLSL을 통해 인접 조각 색상 설정

프로젝트는 렌더 패스를 사용하여 주어진 모델이 텍스처 맵의 UV 좌표에 해당하는 고유 한 색상으로 FBO에 그려집니다. 그런 다음이 색상을 샘플링하고 이미지 좌표로 변환하여 모델에 대한 텍스처 맵을 카메라에 표시되는 것을 기반으로 업데이트 할 수 있습니다. 본질적으로 :

Render model to FBO 
For each FBO pixel 
    1. sample secondary texture based on FBO pixel position 
    2. convert color at current pixel to image coordinate for the model's texture map 
    3. update model's texture with sampled secondary texture at calculated coordinate 
End loop 

문제는 현재 구현이 매우 CPU 바인딩되어 있기 때문에 FBO 밖으로 픽셀을 읽은 다음 조작하는 것이 문제입니다. 이상적으로, 이미 프래그먼트 쉐이더에서 작동 할 프래그먼트의 색상이 있으므로, 마지막 몇 단계 만 진행하여 GPU에서 모든 것을 유지하고 싶습니다.

내가 겪고있는 특정 문제는 조각 쉐이더가 처리하지 않는 조각의 색상을 설정하는 방법 (또는 가능한 경우)을 알 수 없다는 것입니다. 여분의 큰 FBO를 사용하여 작업 할 수없고 색상을 설정하려는 조각을 오프셋하는 경우 텍스처에 직접 쓰는 작업을 수행 할 수 있습니까?

도움/조언을 크게 듣습니다. 감사!

답변

2

필자가 아는 한, OpenGL에서 수행 할 분산 작업 (균일 한 FBO 픽셀 공간 -> 랜덤 메쉬 UV 텍스처 대상)이 필요합니다. 이 경우에도 최대한 빨리 당신이 예상을했던 것으로서 단순, 그리고하지 않을 경우에, 할 수있는 방법입니다,하지만 난 찾을 수없는 하나 더 :

  • 는 동일 유형 GL_POINTS와 크기의 무승부 호출을 실행 너비 * 소스 FBO 높이.
  • 깊이로 레이어가 연결되지 않은 FBO 색상 레이어를 선택하십시오.
  • 버텍스 쉐이더에서 gl_VertexID을 사용하여 원본 화면 좌표를 계산하십시오.
  • 소스 FBO 텍스처의 샘플을 사용하여 색상 및 타겟 위치를 가져옵니다 (원래 FBO 표면이 텍스처라고 가정). 적절한 gl_Position을 할당하고 대상 색상을 프래그먼트 셰이더에 전달합니다.
  • 프래그먼트 셰이더에서 출력에 색상을 복사하기 만하면됩니다.

이렇게하면 GPU가 원래 FBO 픽셀을 모두 통과하고 계산 된 색상을 대상 텍스처 위로 분산시킵니다.

+0

음 ... 아주 재미있는 생각입니다. Tommy의 접근법은 내가 이미 구현 한 것에 더 가깝기 때문에 먼저 그 장면을 제공 할 것입니다. 나는 또한 이것을 시도해 볼 수도 있습니다. – Xenethyl

+0

@ Xenethyl. 나는 당신의 임무를 완전히 이해하지 못했을 수도 있지만 내가 본 것으로부터 - 분산 된 방식은 @ 토미가 설명하는 방식으로 구현 될 수 없다. 따라서 그의 아이디어가 당신의 필요에 맞다고 생각한다면, 물론 그걸로 나아갈 수 있습니다. 왜냐하면 그것은 내 것이 훨씬 간단하기 때문입니다. – kvark

+0

오늘 밤 저녁 식사 후 이것에 대해 생각한 후에 나는 탁구 패스를하는 것이 어떻게 내 문제를 해결하지 않는지 깨닫기 시작했습니다. 귀하의 솔루션이 현재의 설정에 적용되는지 여부는 모르겠지만 토미가 논의했던 것보다 정확하다고 생각합니다. 지금은 이것을 허용 된 것으로 표시했습니다. 내 오해를 지적 해 주셔서 감사합니다. – Xenethyl

5

처리중인 프래그먼트 이외의 곳으로 프래그먼트 셰이더를 쓸 수 없습니다. 당신이하고 싶은 것은 탁구 렌더링입니다.

코드에서

, 당신은 세 가지 텍스처가 귀하의 목록에 작업 일치하는 것 :

  1. 보조 질감
  2. 소스 모델의 텍스처 맵
  3. 대상 모델의 텍스처 맵

첫 번째 실행에서는 (1)과 (2)를 소스 텍스처로 사용하여 (3)을 그립니다. 다음 번에는 루프를 통해 (1)과 (3)을 사용하여 (2)에 쓸 것입니다. 그런 다음 (1)과 (2)를 사용하여 (3)에 쓰려면 다시 전환하십시오. 등등.

그래서 (2)와 (3)은 renderbuffer 대신에 색 버퍼로 제공된 텍스쳐로 framebuffer 객체로 연결됩니다.

NVidia는 2009 년에 GL_NV_texture_barrier extension이라는 글을 쓰면서 독서 장소와 글쓰기 영역 사이의 구분선에 대해 명시 적으로 설명하면 단일 질감으로 압축 할 수 있습니다 (2) 및 (3). 나는 그것이 얼마나 광범위하게 이용 가능한지 말할 수있는 전문 지식이 없다.

FBO에서 가능한 것처럼 동일한 텍스처를 읽고 쓰려고하면 그렇지 않으면 OpenGL에서 정의되지 않은 결과가 발생합니다. 하드웨어 수준의 프롬프트 문제는 캐싱 및 멀티 샘플링과 관련이 있습니다.

+0

우수, 설명해 주셔서 감사합니다. 나는 지금 막 내 머리 속을 훑어 보았고 나는 그것이 어떻게 나를 위해 일할 수 있는지 생각한다. – Xenethyl

+0

죄송 합니다만 동의 해 주셔서 죄송 합니다만, 실제로 탁구 패스를 사용하면 실제로 임의의 위치에 쓸 수는 없으므로 kvark가 정확하다고 생각합니다. – Xenethyl

+0

아니, 맞아. 나는 그것이 아닌 것을 요청했다. 잘하면 나는 어떤 식 으로든 도왔습니다. – Tommy