어디

2016-09-11 3 views
0

빠른 질문을 glEnableVertexAttribArray 올바른 장소 :어디

void draw() { 
    bindVAO(); 
    glEnableVertexAttribArray(0 ... 3); 
    glDrawElements(...); 
    glDisableVertexAttribArray(0 ... 3); 
    unbindVAO(); 
} 

을 나는 또한 나는 것으로 나타났습니다 : 나는 항상 VAO는 theire 정점이 같은 방식으로 호출 '그릴'내부 배열 속성 수 있도록 메쉬 보았다 무조건적인 요소가 같은 전화를 그리기에서 아래로 후반을 생략 할 수있다 :

void draw() { 
    bindVAO(); 
    glEnableVertexAttribArray(0 ... 3); 
    glDrawElements(...); 
} 

마찬가지로 나는 메쉬 생성 /로드 기능에 glEnableVertexAttribArray() 전화를 이동, 모든 것이 잘 실행 것으로 보인다.

이 모든 것이 합법적인지 궁금 해서요. 많은 샘플 코드 (또는 그러한 자연의 다른 것들)가 그리기 호출 옆에 속성 배열을 사용하거나 사용하지 않도록 설정 한 이유가 있다면 모든 프레임/그리기주기는 시간 낭비입니다.

+1

당신이 이것을 보는 이유는 온라인에서 많은 나쁜 예가 있다는 것입니다. 그리고 나서 사람들은 그것들을 복사하기 시작하고 그것들을 더 많이 만듭니다. 각 그리기 호출 전에 이러한 함수를 호출 할 필요가 없다는 것은 처음부터 VAO를 사용하는 주된 목적입니다. –

+0

@Reto Koradi 네, 그건 제가 XD를 고안 한 것입니다. – claudehenry

+0

VAO는이 상태를 저장하므로 모든 상태 설정과 함께 VAO를 사용할 수 있습니다. 또는 VAO를 바인딩 한 다음 그릴 때마다 상태를 계속 변경할 수 있습니다. 둘 다 맞지만 VAO는 변경 사항을 기억할 것입니다. –

답변

2

단일 VAO에서 VAO를 으로 사용하는 경우 버퍼 바인딩을 변경하지 말고 glEnableVertexAttribArray을 VAO 만들기 및 업데이트에 연결하는 것이 좋습니다.

그러나 VAO를 사용하지 않거나 VAO 내의 바인딩을 동적으로 변경하면 바인딩 코드 (일반적으로 도면에서 발생하는)에 근접하여 glEnableVertexAttribArray을 배치하는 것이 더 적합합니다.

+0

내가 생각한 것을 확인하는 멋진, 답변 주셔서 감사합니다. – claudehenry