2012-05-31 2 views
1

Android 용 OpenGL ES 2.0의 삼각형에 이미지를 표시하기위한 간단한 이미지 뷰어를 작성했습니다. 이러한 이미지에는 특정 색상이 있으며, 이는 어떤면에서는 검은 색으로 대체되어야합니다. 문제는 GL_LINEAR이 최소 및 최대화 필터에 사용되는 경우 교체해야하는 색상의 윤곽이 계속 표시된다는 것입니다. 내 필터에 GL_NEAREST를 사용하면 쉐이더가 너무 어려움없이 색상을 대체 할 수 있지만 이미지를 부드럽게 렌더링하지 않으며 확대/축소시 픽셀 화 된 모양을 유지합니다.쉐이더 코드 내에서 텍스처의 색상을 대체하려면 어떻게해야합니까?

이 유형의 작업을 수행하는 더 좋은 방법이 있는지 궁금합니다. 내가 가지고있는 아이디어는 다음과 같습니다.

  • 조각 픽셀에서 한 번만 실행되는 셰이더를 만들고 조각 쉐이더에서 실제로 텍스처를 사용하기 전에 색을 바꿉니 까?
  • 내 쉐이더를 다시 작성하여 GL_LINEAR이 사용되는 경우에도 작동하도록하십시오.

아무에게도 이것이 일반적으로 어떻게 수행되는지에 대한 단서를 줄 수 있습니까? 차라리이 작업을 쉐이더에서 수행해야하는 이유는 마스크 픽셀 색상이 항상 검은 색으로 유지되도록하는 것입니다.

저는 OpenGL ES 2.0을 처음 접했지만 어떻게 작동하는지 배우려고합니다. 그 점을 명심하고 배우도록 도와주세요. 미리 감사드립니다.

+0

현재 알파 채널을 사용하고 있으며 원본 이미지를 옵션으로 편집하고 있습니까? 컬러 키잉보다 알파 ​​채널을 사용하여이 작업을 수행하는 것이 더 적절할 수 있습니다. 그렇지 않으면 나는 더 좋은 방법을 생각할 수 없다. 나는 한계를 꽤 잘 설명했다고 생각한다. – Tim

+0

Dalvik에서는 원본 이미지를 편집하는 데 시간이 많이 걸리며 오버 헤드가 발생하지는 않습니다. 현재 코드는 알파 채널에 아무 것도하지 않지만 우리가 표시하는 이미지는 실제로 16 비트 그레이 스케일입니다.이 비트는 RGB_565로 코딩하고 쉐이더에서 비트를 디코딩합니다. 좀 못생긴지만 일하는 것 같습니다. 최상의 결과는 이미지를 서버에서 사전 처리하고 클라이언트에서 색상 키잉을 전혀 시도하지 않는 것입니다. 우리는이 솔루션을 사용해야 할 수도 있습니다. – Thorinside

+0

마스크 픽셀이 이미지에서 움직이지 않는다고 추가 할 수도 있습니다. 그들은 모두 같은 장소에 있습니다. 나는 또한 알파 텍스처를 만들려고 시도하고 그것을 사용하여 출력 픽셀의 알파를 설정한다고 생각하십니까? 아니면이 경우 윤곽선 문제를 볼 수 있습니까? – Thorinside

답변

1

그런 경우 (항상 마스크가 같은 장소), 나는 더 많은 옵션을 가지고 있다고 생각합니다.

나는 그 다음 쉐이더에서, 당신은 원래의 질감과 마스크 텍스처를 샘플링 0

와 1과 마스크 영역과 단일 채널 이미지와 마스크되지 않은 영역을 만들 것이고, 당신은 마스크 색상을 교체 할 수 있습니다 마스크 값이 특정 임계 값보다 큰 경우 소유.

픽셀을 거부하는 값을 조정할 수 있기 때문에 GL_LINEAR을 사용하면이 문제가 다소 완화됩니다.

예를 들어 마스킹 된 픽셀과 마스킹되지 않은 픽셀 사이에서 오른쪽 샘플링을하면 마스크 값은 0.5가되고 색상은 (0.5 * color_key + 0.5 * unmasked_color)가됩니다. 이처럼 받아 들일 수없는 색상 번짐을 발견하면 알파 리 젝트를 0.1, 0.001 등으로 설정하여 약간의 마스크가있는 픽셀을 마스크 할 수 있습니다. 이렇게하면 가면 영역이 약간 넓어 지지만 결과의 아무 곳이나 색상 키의 흔적을 볼 수 없게됩니다.

+0

또한 마스크와 텍스처가 동일한 해상도인지 확인하십시오. 그렇지 않으면 잘 작동하지 않을 수 있습니다. – Tim

+0

나는 당신이 말하는 것을 이해합니다.저는 샘플링이 일어나고 있음을 알기 위해 실험을했으며, 텍스쳐를 샘플링 할 때 0.5를 반환하는 선형 보간법에 대해 말하고 있습니다. 이것은 아마도 효과가있을 것이다. 이런 식으로 구현할 수 있는지 알아볼 것입니다. 감사. – Thorinside

+0

방금 ​​마스크 텍스처를 추가하고 제안 된대로 쉐이더에서 사용하여 테스트 구현을 만들었습니다. 그것은 위대한 작품. 다시 한 번 감사드립니다. @Tim. – Thorinside

관련 문제