2014-04-15 1 views
2

2 차원 텍스처 S가 있고 3 차원 텍스처 H를 반환하고자합니다. 즉, 픽셀 H [r, g, b]가 텍스처 S의 색상 rgb 픽셀 수와 같습니다. 기본적으로 히스토그램 텍스처의 색이.webgl 조각 쉐이더에서 색상으로 픽셀 수를 계산하십시오.

나는 occlusion 쿼리에 대해 알고 있지만, webgl2에서만 사용할 수 있으며, 심지어 부울 결과가있는 IIUC도 있으며 각 색마다 별도의 쿼리를 수행해야합니다. 이상적으로는 하나의 조각 셰이더 패스에서이 작업을 수행하고 싶습니다. 프래그먼트 쉐이더에서 작업을 줄일 수있는 방법이 있습니까? (당신이 관심이 있다면)

왜이 필요합니다 I가 WebGL 조각 쉐이더에있는 객체 및 정적 지형 사이의 픽셀 완벽한 2D 충돌 감지를 할 노력하고있어

.

옛날부터 트릭을 사용하여 (0,0), (0, dy), (dx, 0) 및 (dx, dy) 픽셀만큼 이동하여 스프라이트를 4 번 그리기 - 매번 스프라이트의 픽셀이 지형과 충돌합니다. 가능한 한 빨리 지형의 바운스로 이동해야하는 방향을 나타내는 벡터 (nx, ny)를 계산할 수 있습니다. 객체의 속도에 벡터를 추가하기 만하면 객체가 지형을 따라 멋지게 움직입니다 (언덕 아래로, 범프 위로 점프 등). 나는 오래된 C++ 게임에서 그 것을 사용했고 그것은 훌륭하게 작동하지만, 너무 느리다.

게임에서 모든 스프라이트의 정점 버퍼 전체를 그린다. (어떤 오브젝트가 충돌 하는지를 인식 할 수 있도록 각기 다른 색상으로되어있다.) 매번 4 번 그 위에 검은 지형을 그려서 각각의 픽셀을 센다. 결과로 나오는 4 개의 프레임 버퍼의 색상.

문제는 - 조각 쉐이더에서 픽셀 수를 계산하는 방법입니다.

+0

소리가 복잡하고 불가능합니다. 각 채널에 대해 .5를 추가로 혼합 한 다음 스프라이트마다 별도의 영역 내에서 .75 이상의 렌더링 텍스처를 확인하도록 제안했습니다. – Jessy

+0

분명히 복잡하지만 불가능한 것은 아닙니다.히스토그램은 HDR tonemapping과 같은 많은 실시간 응용 프로그램에서 매우 필요합니다. 반면, 조각 쉐이더를 한 번 호출 할 때 WebGL 클래스 하드웨어에서는 불가능하거나 최소한 실용적이지 않습니다. 'imageLoad (...)와'imageStore (...)를 사용하면 DX11 클래스 하드웨어에서 가능할 수 있지만 여전히이 문제에 접근하는 좋은 방법처럼 들리지는 않습니다;) –

답변

2

프래그먼트 셰이더의 픽셀 수를 계산하는 방법은 무엇입니까?

한 번에 GPU 시간 초과 예외 또는 너무 많은 명령 예외가 발생할 수 있습니다. 내가 최근 WebGL을의 한계보고 몇 가지 프로파일을 실행 : 기본적으로 Can one fragment access all texture pixel values in WebGL GLSL? (Not just it's own TexCoord)

당신이 텍스처의 각 픽셀을 반복하는 (X/Y에 대한 루프 또는 2 개) 루프를 사용하려면를,이 예에서는 모든 추가 하나 개의 픽셀에 색상 값은 : 다른 색상의 총 발생을 대표하는 각 픽셀을 원한다면

void main() { 
    vec4 color_register = 0.0; 
    for (float x = 0.0; x < PIXELS_WIDE; x++) 
     for (float y = 0.0; y < PIXELS_TALL; y++) 
      color_register += texture2D(tex0, vec2(x/PIXELS_WIDE, y/PIXELS_TALL)); 
    gl_FragColor = color_register; 
} 

그런, 당신은 C이의 수 C 픽셀로 표면에 렌더링 할 필요가 당신이 원하는 히스토그램의 독특한 색. 이를 위해서는 각 픽셀이 색상 값을 알고 있어야합니다. 가장 간단한 방법은 모든 색상을 한 번 포함하고 UV (텍스처 좌표)로 샘플링 한 다음 실제 장면의 모든 픽셀을 반복하여 히스토그램 및 집계하는 것입니다 해당 색상 :

void main() { 
    vec4 this_pixels_unique_color = texture2D(tex_unique_colors, tex_coord); 
    int occurrences_of_this_unique_color = 0; 
    for (float x = 0.0; x < SCENE_PIXELS_WIDE; x++) 
     for (float y = 0.0; y < SCENE_PIXELS_TALL; y++) 
      color_register += texture2D(tex_scene_to_histogram, vec2(x/SCENE_PIXELS_WIDE, y/SCENE_PIXELS_TALL)); 
    gl_FragColor = vec4(occurrences_of_this_unique_color, occurrences_of_this_unique_color, occurrences_of_this_unique_color, 1); 
} 

는 각 픽셀의 어둠이 histogramed 장면에서 색상의 양을 나타내는 각각의 고유 한 색상에 대한 하나의 픽셀로 렌더링 된 표면을을 떠난다.