2012-04-28 2 views
2

WebGL (≈ OpenGL ES 2.0)을 사용하고 있습니다. 현재 응용 프로그램에서는 텍스처 단위 0을 모델 별 텍스처로 사용하고 1과 2는 셰이더에서 사용하는 상수 텍스처로 사용합니다. 로드 텍스처를 설정하기 위해텍스처 초기화와 관련하여 glActiveTexture를 어떻게 관리해야합니까?

, 제가 그러나

var texture = gl.createTexture(); 
gl.bindTexture(gl.TEXTURE_2D, texture); 
gl.texImage2D(...); 
gl.texParameteri(...); 

을,이 텍스처 현재 텍스처 유닛에 결합 된 상태에서 굴러. 그것은 단지 어쨌든 기하학 드로잉 전에 리셋 텍스처 장치 (0)에 대한 바인딩 영향 때문에이 프로그램을 방지하기 위해, I는 상기 코드의 시작

gl.activeTexture(gl.TEXTURE0); 

첨가.

'스크래치'텍스처 단위를 사용할 수있는 상황이 발생하지 않는 더 나은 방법이 있습니까? 이 상태 관리 문제에 대해 확립 된 모범 사례가 있습니까?

답변

1

제게있어이 문제는 다른 몇 가지 범주와 같습니다 : 프로그램의 특정 시점에서 GL 상태에 대해 어떻게 생각합니까?

  1. 아무것도 없다고 가정, 그리고 국가에게 당신이 그것을 필요로하는 방식을 설정

    AFAICT 당신은 기본적으로 두 가지 옵션이 있습니다. 현재 glActiveTextrure()으로 전화하십시오.

  2. 프로그램의 특정 지점에서 GL이 있어야하는 상태에 대한 규칙을 설정하십시오. 예 : 귀하의 경우 드로잉 파트 호출이 완료되면 glActiveTexture(gl.TEXTURE0)을 호출해야하므로 드로잉 전의 파트는 그렇게 설정되었다고 가정 할 수 있습니다.

하지만 실제로 그렇게 생각하지 마십시오. OpenGL에서 당신은 많은 폴리곤을 전달하여 함수 호출에 대한 폴리곤의 비율을 극대화함으로써 프로그램을 최적화합니다 (glDrawArrays() 등)

+0

고마워요,하지만 저는 묻지 않습니다 "활성 텍스처 유닛에 대한 정책은 무엇이되어야합니까?" - 이미 설명 된 원칙을 따릅니다. 그러나 "다른 텍스처 유닛 사용에 방해가되는 텍스처를 어떻게 초기화해야합니까?"는 규칙에 대한 제약을 제안 할 수 있습니다. –

+0

당신은 내가 말한 것에 대한 또 다른 예를 읽을 수 있습니다. GL에는 '발을 밟을 수있는 상태가 많이 있습니다. 당신은 그 작업을 위해 별도의 텍스처 유닛을 사용할 수 있습니다. 즉, 아무것도 재설정 할 필요가 없지만'glActiveTextureUnit()'를 두 번 호출해야한다는 것을 의미합니다. 또는 현재 텍스처 유닛을 clobber 한 다음 텍스처 상태를 설정하는 책임을 드로잉 파트에 전달할 수 있습니다. 어느 쪽이든, 당신의 프로그램 (일종의)의 일부는해야 할 여분의 일이 있습니다. –

+0

한 가지 방법이나 다른 방법으로가는 것은 효율과 유지 관리간에 * 작은 * 절충점이됩니다. –

관련 문제