2010-07-04 5 views
3

역 기구학 및 모프 타겟을 기반으로 실시간 캐릭터 애니메이션 작업에 전념하고 있습니다.iPhone SDK가 포함 된 OpenGL ES에서 쉐이더 사용 방법

오픈 소스 (FLTK 기반, 슬프게도) IK 체인 스타일의 애니메이션 프로그램 인 Animata를 통해 공정한 방법을 얻었습니다. 심지어 렌더링 코드를 다양한 플랫폼 (Java/Processing 및 iPhone)에 이식하기도했습니다. alt video http://ats.vimeo.com/612/732/61273232_100.jpgvideo of Animata renderers

그러나 코드가 특히 최적화되어 있으며 CPU 각 프레임을 렌더링하는 것은 약간 불필요 해 보인다.

나는 지금은 '두 개의 뼈 스키닝 쉐이더'

// A vertex shader that efficiently implements two bone skinning. 

attribute vec4 a_position; 
attribute float a_joint1, a_joint2; 
attribute float a_weight1, a_weight2; 

uniform mat4 u_skinningMatrix[JOINT_COUNT]; 
uniform mat4 u_modelViewProjectionMatrix; 

void main(void) 
{ 
    vec4 p0 = u_skinningMatrix[int(a_joint1)] * a_position; 
    vec4 p1 = u_skinningMatrix[int(a_joint2)] * a_position; 
    vec4 p = p0 * a_weight1 + p1 * a_weight2; 
    gl_Position = u_modelViewProjectionMatrix * p; 
} 
에 대한 코드를 발견 실시간 캐릭터 애니메이션에 크게 의존 아이 패드 응용 프로그램을 만들기 위해 프로젝트를 시작하고, 아이폰 OS 문서를 넘기는하고

아무도 이런 스 니펫을 어떻게 사용하는지 알 수 없습니까? 아주 적은 문맥으로 제시됩니다. 제가하고 싶은 것은 IK 체인 뼈대 애니메이션을하기 위해서 제가해야 할 일이지만, GPU에서하고 싶습니다.

답변

3

나는 많은 연구를 해왔으며 지금은 이것이 거의 무엇인지 거의 이해하고있는 것처럼 느껴진다.

제가 배운 첫 번째 중요한 교훈은 OpenGL 1.1이 OpenGL 2.0과 매우 다르다는 것입니다. v2.0에서는 데이터 배열이 GPU에 공급되고 셰이더가 렌더링 세부 사항에 사용되는 것으로 보입니다. 이는 pushmatrix/popmatrix 및 다양한 인라인 드로잉 명령을 사용하여 일반적인 응용 프로그램 코드에서 더 많은 작업이 이루어지는 v1.1과 다릅니다. 여기에 해당 OpenGL은 최신 방법을 소개하는 블로그 게시물의

훌륭한 시리즈 : Joe's Blog: An intro to modern OpenGL

제가 위에서 설명하는 버텍스 쉐이더는이 정점 위치의 집합의 변환을 실행합니다. '속성'멤버는 버텍스마다 있고 '균일'멤버는 모든 버텍스에서 공통입니다.

이 코드를 작동 시키려면 벡터 위치 (원래 위치)의 배열, 조인트와 가중치 (다른 속성 변수)의 해당 배열을 공급해야하며이 셰이더는 입력 정점의 위치를 부착 된 관절.

균일 변수는 먼저 제공된 텍스처 이미지와 관련이 있습니다. 그리고 제가 생각하기에 프로젝션 매트릭스는 월드 좌표계를 특정 요구 사항에보다 적합한 것으로 변환하는 것과 관련이 있습니다.

iPhone 개발과 관련하여 할 일은 OpenGL ES 템플릿 프로젝트를 만들고 두 가지 다른 렌더링 클래스에주의를 기울이는 것입니다. 하나는 선형 및 구형 OpenGL 1.1 용이고 다른 하나는 OpenGL 2.0 용입니다. 개인적으로는 구형 아이폰 기기에 주로 적용된다는 점에서 GL1.1 코드를 던지고 있습니다. 아이 패드를 타겟으로하고 있기 때문에 더 이상 관련이 없습니다. GL2.0을 사용하여 GPU에서 쉐이더를 사용하면 더 나은 성능을 얻을 수 있습니다.

+0

Apple 개발자 도구에 포함 된 OpenGL Shader Builder를 살펴 보는 것도 좋습니다. 유니폼 변수를 추가한다고해서 셰이더 코드에서이 변수를 실제로 참조 할 때까지 (내가 너무 오랫동안 내 머리를 긁적 거리게 만들 때까지) 놀 수있는 무언가로 나타나지는 않습니다. Joe의 예제는 대부분 Shader Builder에서 테스트 할 수 있으므로 원칙을 중심으로 머리를 쓰려면 C를 모두 작성할 필요가 없습니다. –

관련 문제