2016-06-14 2 views
2

Allegro 5에서 게임을 프로그래밍 중이며 현재 드로잉 알고리즘을 연구 중입니다. 계산 후 나는 두 개의 ALLEGRO_BITMAP* -objects로 끝난다. 그 중 하나가 그곳에 그려진 지형을 가진 나의 "장면"이고 다른 하나는 그림자지도이다.Allegro에서 비트 맵을 부분적으로 채색하는 방법이 있습니까?

장면은 단순히 비트 맵에 그려지는 게임 요소의 텍스처입니다. shadow-map은 이전에 렌더링 된 그림자에 밝은 색과 흰색 색의 검정색을 사용하는 비트 맵입니다.

화면의 비트 맵을 그리기 위해 나는 al_draw_scaled_bitmap(...)al_set_blender(ALLEGRO_DEST_MINUS_SRC, ALLEGRO_ONE, ALLEGRO_ONE)을 사용하여 쉐도우 맵의 흰색 요소를 빼내어 보이게 만듭니다.

내가 가진 문제는 이전에 모든 프레임에서 계산 된 모든 색조로 채색되도록 그림자 맵의 흰색 인 모든 픽셀을 갖고 싶다는 것입니다. 회색은 부분적으로 착색 됨).

최종 색은 rgb의 적색, 녹색 및 청색 채널에 대해 p = the pixel-color on the scenec = the world-color과 같이 계산 될 수 있습니다.

알레그로 5에서 부분 착색 효과를 얻을 수있는 방법이 있습니까? (대용량 오버플로가 아님) ?

나는 셰이더를 사용하는 것을 생각했지만, 이것들을 내 ALLEGRO_BITMAP* -objects로 구현하는 해결책을 찾지 못했습니다.

+0

비트 맵을 하위 비트 맵으로 나눌 수는 있지만 원하는 것은 아닙니다. 사진 몇 장을 포함시켜 주시겠습니까? 두 가지가 작동하며, 현재 가지고있는 것과 갖고 싶은 것. – rlam12

답변

3

알레그로의 블렌더는 매우 간단하므로이 경우 셰이더가 필요합니다. 단순히 셰이더를 작성하고 섀도우 맵 al_use_shader을 그릴 때 셰이더를 수행 한 다음 al_use_shader(NULL)을 완료하면됩니다. 셰이더는 al_get_default_shader_source으로 얻을 수있는 기본 정점 소스를 사용할 수 있습니다. 따라서 조각 쉐이더 만 작성하면됩니다. 프래그먼트 셰이더의 색조는 uniform vec4이어야합니다. 또한 대상의 x 및 y 값을 재현하는 x, y 플로트가 있습니다. 또한 장면 비트 맵 인 샘플러가 있습니다 (드로잉을 할 때부터 대상이되어야 함). 샘플러에서 x, y로 샘플링합니다 (x와 y는 0에서 1 사이 여야합니다. xpixel/width (y와 동일)를 사용하여이를 얻을 수 있습니다). 그런 다음 입력 색상으로 계산 한 다음 저장하십시오 gl_FragColor의 결과 (이 텍스트는 GLSL (OpenGL)을 사용한다고 가정합니다 .Direct3D와 같은 원칙이 적용됩니다.) 셰이더 작성에 대한 자세한 내용은 Allegro 소스 코드의 src/shader_source.inc에서 기본 셰이더를 확인하십시오.

+0

고마워, 나는 그것을 시험해 볼 것이다! – 0liCom

+0

+1 비트를 변경하고 그림자를 계산하고 이것을 display-backbuffer에 그려 넣기 위해 모든 것이 그려져있는 backbuffer 비트 맵을 사용하더라도 잘 작동합니다. 여전히 개선 될 수는 있지만 효과가 있으며 그 순간에 내가 원하는 모든 것입니다. 성능은 충분합니다. – 0liCom

관련 문제