2014-02-20 2 views
0

LWJGL과 함께 Java를 사용하여 게임을위한 Lights/Shadows 시스템을 작성했습니다.OpengGL Light Blending

Blue Light with Shadows Red Light with Shadows

내가 이러한 질감 (0, 0, 1) 또는 (1, 0, 0 가득 있음을 경고한다 : 발광 엔티티의 각각에 대해 나는 그런 질감을 생성) 픽셀을 사용하고 알파 채널을 사용하여 그라디언트 효과를 얻습니다. 알파 채널을 그라디언트 요소로 해석합니다.

그런 다음 각각의 라이트/섀도우 텍스처를 하나의 텍스처에 혼합하여 각 텍스처가 올바른 위치에 놓 이길 원합니다. 이를 위해 Framebuffer를 사용합니다. 단지 최대 (사, 다),로 진술 할 것입니다 내가 GL_MAX를 들어, 임의로 알파 채널 혼합 기능에 대한 GL_ONE/GL_ONE을 선택

glBlendEquationSeparateEXT(GL_FUNC_ADD, GL_MAX); 
glBlendFuncSeparateEXT(GL_SRC_ALPHA, GL_DST_ALPHA, GL_ONE, GL_ONE); 

: 나는 다음과 같은 혼합 식/기능의 조합을 사용하여 원하는 효과를 달성하기 위해 노력 here, 즉 배율 인수가 사용되지 않음을 의미합니다. 이 조합의 결과는 다음과 같습니다. Blended Lights/Shadows 이 이미지는 Apple의 OpenGL 드라이버 프로파일 러에서 얻은 것입니다. 따라서이 이미지는 내 응용 프로그램을 사용하여 렌더링하지 않았습니다 (최종 결과가 엉망이 될 수 있음). 다음 단계는 이미지를 어둡게하기 위해 곱셈 블렌딩을 사용하여 실제 텍스처 위에이 텍스처를 렌더링하는 것입니다.하지만 조명/그림자 텍스처는 분명히 잘못되었습니다. 서로 빛/그림자 텍스처의 가장자리를 볼 수 있기 때문에 분명히 잘못되었습니다. .

원하는 결과를 얻으려면 어떻게해야합니까?

편집 : 스케일링 요인에 대한 내 선택을 설명하는 것을 잊었다 : 단순히 각각의 빛의 색상을 추가하는 것이 옳을 것 생각 이 (각각의 알파 값으로 그들 각각을 숙고) 및 최종 조각의 알파를 각 중첩하는 빛 중에서 가장 큰 것으로 선택하십시오.

답변

1

텍스처 사각형 중 하나가 순수한 녹색과 같은 임의의 패턴으로 현재 테두리 외부로 확장되었다고 상상해보십시오. 우리가 어떻게 든 두 가지 다른 블렌딩 함수를 사용할 수 있다고 상상해보십시오. 하나는 경계 안쪽에, 다른 하나는 바깥쪽에 있습니다. 국경 밖에서는 혼합 기능

glBlendFuncSeparateEXT(GL_ZERO, GL_ONE, GL_ONE, GL_ONE) 

을 사용하는 경우 우리는 우리가 우리에게 연속 혼합 결과를 제공하기 위해 내부 사용 어떤 블렌딩 기능을 원하는 것이 당신이 여기있는 동일한 이미지 (녹색 보여주는 없음)을 얻을 것입니다. 블렌딩 기능

glBlendFuncSeparateEXT(GL_SRC_ALPHA, GL_DST_ALPHA, GL_ONE, GL_ONE) 

우리는 그런 결과를 얻지 못할 것입니다. 국경 근처에서 소스를 무시한다는 것을 의미하는 첫 번째 매개 변수 (정확하게 이미지 설명을 읽으면 국경의 작은 알파)가 그다지 많지 않습니다. 따라서 두 번째 매개 변수 여야합니다. 소스 알파가 작은 경우에만 대상을 원합니다. GL_DST_ALPHAGL_ONE_MINUS_SRC_ALPHA으로 변경하십시오. 이것은 더 표준적인 것이지만 어쩌면 당신의 목표를 이해하지 못하고 있을까요?