2012-01-31 2 views
5

안드로이드 응용 프로그램,이 표면의 다른 정점에 depanding 표면의 법선을 계산하고 싶습니다. 많은 시간이 걸리기 때문에 나는 "마스터"프로그램에서 그것을하고 싶지 않습니다.OpenGL 2의 버텍스 쉐이더 프로그램에서 다른 버텍스에 접근하는 방법은 무엇입니까?

attribute vec3 a_bottom; 
attribute vec3 a_left; 
attribute vec3 a_right; 
attribute vec3 a_top; 

vec3 calculNormal() { 
    return normalize(cross((a_left - a_right) , (a_bottom - a_top))); 
} 

은 내가 아는 아주 아주 더러운 코드를 매우, 그래서 대신 4 개 배열을 전달하는, 내가하고 싶지 : 실제로 각 정점 나는 각 vextex 4 float 배열을 통과

vec3 calculNormal() { 
    vec3 a_left = CURRENT_FLOATBUFFER[ CURRENT_FLOAT_BUFFER_POSITION - 1 ]; 
    vec3 a_bottom = CURRENT_FLOATBUFFER[ CURRENT_FLOAT_BUFFER_POSITION - X ]; 
    ... 
    return normalize(cross((a_left - a_right) , (a_bottom - a_top))); 
} 

그래서 버텍스 쉐이더 프로그램에서 현재의 float 버퍼에 접근 할 수 있습니까? currentFloat와 같은 특별한 키워드가 있습니까? 아니면 내가 그리워 할 또 다른 가능성이 있니?

답변

8

실제로 가능하지 않습니다. 버텍스 쉐이더는 현재 처리중인 버텍스와 그 속성에만 접근 할 수 있습니다. OpenGL ES에는 texture_buffer_object 확장자가 없으므로 셰이더 내부의 VBO 데이터에 액세스 할 수 없습니다. 따라서 꼭지점의 이웃에 액세스하는 유일한 방법은 첫 번째 예와 같이 꼭지점 속성으로 명시 적으로 넣는 것입니다.

그러나 지오메트리가 직사각형 패턴 인 것처럼 보이기 때문에 텍스쳐에 저장하거나 (012로 복사하거나 ES에서 지원되는 경우 pixel_buffer_object 확장이 도움이 될 수 있습니다). 이 경우, 출력 이미지의 각 "픽셀"(이 경우 정점) (이 경우 직사각형 지오메트리의 일반 데이터)에 대한 법선을 계산하는 고전적인 GPGPU 조각 셰이더를 사용할 수 있습니다. 그것의 이웃 (단순한 텍스처 액세스로 접근).

하지만 처음의 컴퓨팅과 오버 헤드 및/또는 메모리 복사 작업을 고려할 때 첫 번째 프로세서도 아니고 두 번째 프로세서도 아무 것도 없을 것이라고 생각합니다. 어쨌든 모든 프레임을 수행 할 필요는 없습니다. 실제로 수행하면 정점 위치도 업데이트하기 때문에 그럴 수 있습니다.이 경우 정상 데이터 (CPU 또는 GPGPU).

4

이 서페이스의 다른 정점에 디아디 언트하는 서페이스의 법선을 계산하고 싶습니다.

잘못된 접근. 법선을 계산하고 꼭지점과 함께 저장합니다.

많은 시간이 걸리기 때문에 "마스터"프로그램에서 사용하고 싶지 않습니다.

각 렌더링 패스에 대한 법선을 다시 계산해서는 안됩니다. 그것들을 계산해서 저장하십시오. 버텍스 쉐이더에서의 계산은 무료가 아닙니다. VS에서 법선을 계산하는 것은 처리 능력의 낭비입니다.

계산하여 저장하십시오.

+0

안녕 datenwolf. 런타임에 객체를 생성 한 후 하이트 맵을 샘플링하려면 어떻게해야합니까? 셰이더를 통해 이것을 실행하여 하이트 맵을 샘플링하고 꼭지점을 변환 한 다음 다시 보내고 다른 VBO를 업로드해야합니까? 나는 CPU에서 텍스처를 샘플링하는 것이 실제로는 아니라고 생각합니다. 글 텍스는 glTexImage를 사용하여 업로드되었고 CPU는 실제로 그것을 가지고 있지 않습니다. – Zebrafish

+1

@TitoneMaurice : 원래 질문은 일반적인 메쉬에 관한 질문이었습니다. 그러나 하이트 맵은 특별한 경우이며, 표면 법선은 오른쪽 커널 (이산 차이, 일명 그래디언트 커널)과의 컨볼 루션을 사용하여 계산할 수 있습니다. 'textureGather' (GLSL-4 이후)를 사용하면 2 × 2 그리드의 텍셀을 가져올 수 있습니다. 이것이 필요한 것입니다.그러나 법선을 미리 계산할 것을 권장합니다. 법선은 텍스처에 대한 법선 맵이 효과적인지를 알려줍니다. – datenwolf

+1

@TitoneMaurice : 응용 프로그램 아이디어 : 고해상도에서 하이트 맵을 생성하고 그로부터 노멀 맵을 생성하고, 조명 계산을위한 전체 해상도 노멀 맵 (조각 셰이더에서) 및 버텍스 위치 변경을위한 하향 샘플 하이트 맵을 사용하십시오. 추가 아이디어 : 전체 해상도 높이 - 노멀 맵을 저장하고 버텍스 단계에서 더 낮은 해상도의 LoD에 액세스 할 수 있으며 프래그먼트 셰이더에서는 전체 해상도와 꼭지점 높이 값의 차이를 시차 매핑에 대한 입력으로 사용하여 시각적 품질을 높일 수 있습니다. – datenwolf

관련 문제