2016-09-21 4 views
0

HTML5에서 텍스처가 WebGL 컨텍스트에로드되는 페이지에서 작업하고 있습니다. 그러나이 질문은 OpenGL (ES) 버전에서 일반적으로 가능합니다. 텍스처가 (glBindTextureglTexImage2D 통해) GPU에 업로드되면텍스처 매개 변수는 어떻게 처리됩니까?

glTexParameteriglTexParameterf 함수를 호출 할 수있다. 이 함수는 텍스처에 대한 매개 변수를 설정합니다.

그러나 이러한 매개 변수가 실제로 설정되는 개체가 무엇인지는 분명하지 않습니다. 현재 활성 텍스처 슬롯에서 활성화되어있는 실제 텍스처로 설정되어 있습니까? 현재 활성 텍스처 슬롯 자체에 설정되어 있습니까? 아니면 모든 텍스처에 대해 전 세계적으로 설정되어 있습니까?

다른 점은 다음과 같습니다. 하나 이상의 텍스처 슬롯에서 다른 매개 변수를 사용하여 동일한 텍스처 (GPU에 한 번만로드 됨)를 사용할 수 있습니까?

답변

0

약 5 개의 다른 답변을 반복하지만 ...

텍스처 조작은 다음과 같이 작동합니다.

internalGLState = { 
    activeTextureUnit: 0, 
    textureUnits: [ 
     { TEXTURE_2D: ?, TEXTURE_CUBEMAP: ?, }, 
     { TEXTURE_2D: ?, TEXTURE_CUBEMAP: ?, }, 
     { TEXTURE_2D: ?, TEXTURE_CUBEMAP: ?, }, 
     { TEXTURE_2D: ?, TEXTURE_CUBEMAP: ?, }, 
     { TEXTURE_2D: ?, TEXTURE_CUBEMAP: ?, }, 
     { TEXTURE_2D: ?, TEXTURE_CUBEMAP: ?, }, 
     ... 
    ], 
}; 

텍스처가 현재 활성 텍스처 유닛 및 그 장치에 대한 바인드 점 참조하는 텍스처 유닛의 글로벌 세트가있다.

그래서, gl.activeTexture 효과적으로이

gl.activeTexture = function(unitId) { 
    internalGlState.activeTextureUnit = unitId - gl.TEXTURE0; // conver to index 
} 

다른 모든 텍스처 기능은 기본적으로 그래서 예를 gl.texParameteri

설정은 텍스처에있는
gl.texParameteri = function(bindPoint, settingId, value) { 
    var texture = getTexture(bindPoint); 
    texture.internalApplySetting(settingId, value); 
} 

function getTexture(bindPoint) { 
    return internalGLState[internalGlState.activeTextureUnit][bindPoint]; 
} 

처럼 작동한다.

셰이더

gl.uniform1i(someSamplerUniformLocation, textureUnitIndex); 

니콜로서 텍스쳐 유닛의 인덱스 텍스처 참조 (단위 시간당 각각의 결합 지점에 대한 하나 개의 기준있다 제외) "조직 단위"텍스처 참조 단지 효과적인 배열이다 WebGL 1.0에서는 다른 매개 변수를 사용하여 동일한 텍스처를 가질 수 없다는 것을 지적했습니다. 샘플러 객체를 사용하여 WebGL 2.0에서 작업 할 수 있습니다 (곧 출시 될 예정 임).

제 질문은 왜 같은 텍스처에 대해 서로 다른 매개 변수를 사용 하시겠습니까?상업용 비디오 게임에서 일하는 사람으로서 나는 한번도 한 번도 아티스트에게 그렇게하지 말라고 요청한 적이 없기 때문에 제한적인 기능으로는 찾아 내지 못했습니다.

WebGL에서 원하는 경우 다중 텍스처를 만들거나 다른 매개 변수가 동시에 필요하지 않은 경우 사용 간 매개 변수를 변경해야합니다.

1

OpenGL 3.x+ nomenclature (ES 및 WebGL에서 공유 됨) 형식의 모든 함수는 glTex* 형태로, 지정된 텍스처 대상을 사용하여 현재 텍스처 단위에 바인딩 된 텍스처 객체를 수정합니다.

다른 텍스처 단위에 동일한 텍스처를 바인딩 할 수 있습니다. 하지만 다른 매개 변수를 줄 수는 없습니다. 동일한 텍스처로 다른 샘플링 매개 변수를 사용하려는 경우 을 사용하면 WebGL에서 운이 좋지 않은 Sampler Objects 을 사용해야합니다.

관련 문제