2
예를 들어

...저급 AGAL에서 코딩하는 동안 텍스처 당 새로운 Program3D를 만들어야합니까?

내가 (기본적으로 고유 한 스프라이트,) 거기에 하나 개 이상의 질감을 필요로하는 응용 프로그램을 개발하고 있어요 경우, 나는 VertexShaderAssembler와 함께 새로운 Program3D (context3D.createProgram();를 호출하고 조립해야하나요 a FragmentShaderAssembler)을 사용하고 싶습니다.

Program3D은 일반적으로 엔진 내에서 어떻게 작동합니까? 합니까 전체를 실행하거나 하나 개의 프로그램을 사용합니까텍스처, 모델, 매핑 당 하나 개 프로그램?

초기화 시간 (Event.ADDED_TO_STAGE) 동안 Program3D을 한 번만 만들고 각 프레임 (Event.ENTER_FRAME)을 만들 때만 필요하다고 가정합니다. 맞습니까?

답변

3

하나의 프로그램 (셰이더)에 여러 개의 텍스처가있을 수 있습니다. 대개는 각 셰이더에 대한 프로그램을 작성하십시오. 예를 들어 게임에서 지형 조명, 텍스처링 및 채색을위한 하나의 셰이더 (프로그램)가 있습니다. 나는 물을위한 또 다른 쉐이더 (프로그램)를 가지고있다.

그래서 프로그램은 한 번 만들어졌지만 장면을 그리기 전에 사용할 프로그램을 context3d에게 알려줍니다. 그렇게하면 현재 프로그램으로 그릴 내용을 그릴 수 있습니다.

사용 예제는 :

context3d.setProgram(WaterShader); 
water.drawTriangles(); 

context3d.setProgram(TerrainShader) 
terrain.drawTriangles(); 

내가 먼저 물을 끌어하고 지형, 각각 다른 쉐이더를 사용하여. 내 TerrainShader에 여러 개의 텍스처가 있습니다 (예 : 모래, 바위 및 흙 질감. 셰이더는 주어진 시간에 사용할 텍스처를 결정합니다. 예 : 정점의 높이가 < 인 경우 모래 텍스처를 사용합니다.

그래서 프로그램을 한 번 만들고 필요할 때 사용하십시오.

올바른 방법으로 도움이 되었기를 바랍니다.

1

각 텍스처에 대해 새 Program3D가 필요하지 않습니다. 렌더러는 drawTriangles()를 호출 할 때마다 마지막 프로그램 세트를 사용합니다. 다른 텍스처 쉐이더가 필요하도록 특정 텍스처를 다르게 처리해야한다면, 하나 이상의 Program3D 객체가 필요하지만, 모든 객체와 텍스처에 대해 다른 쉐이더가 필요한 드문 경우입니다.

엔진을 작성하지 않았는데, 이것이 일반적으로 어떻게 수행되는지는 말할 수 없습니다. 나는 당신이 다른 클래스의 모델, 환경 맵 등을 위해 다른 Program3D 객체를 가질 것이라고 생각할 것이다. 약 4000 개의 Program3D 객체로 제한됩니다.

예, 미리 Program3D 개체를 만들고 초기화해야합니다. 렌더링하는 동안 Context3D.setProgram()을 호출하여 활성 프로그램을 지정합니다. 이 프로그램은 사용자가 변경하기 전까지 렌더링에 사용됩니다.

+0

Ah k, Context3D.setProgram (...)을 호출하는 순서는 원하는 Z-Depth 결과를 얻는 데 중요 할 수 있습니다. 맞습니까? – bigp

+0

그래서, 내가 상상할 수있는 Program3D를 번갈아 사용할 때 Context3D를 지울 필요가 없다는 것을 의미합니다. 특히 하나의 렌더링 패스가 다른 이전 패스를 오버레이하는 것일 때 특히 그렇습니다. – bigp

+0

깊이 테스트를 작동 시키려면 올바른 순서로 물건을 그려야합니다. 그것은 setProgram()을 호출하는 순서를 결정할 수도 있습니다. present() 호출 당 한 번만 지워야합니다. –

관련 문제