2013-06-08 3 views
1

컬러 채워진 부분을 렌더링해야하는이 프로그램을 만들고 있습니다. VBO를 사용하고 있습니다. 나는 정점에 대한 데이터와 색상을 저장하는 방법을OpenGL 인터리빙 된 VBO 보폭 및 오프셋

이는 다음과 같습니다 렌더링

를 쿼드 : 이제 내 목표는 인터리브 VBOs을 사용하는 것입니다하지만 난 캔트 참조로

buff.put(3 floats color) 
render the quad (3 floats per vertex * 4 per face * 6 per quad) 

스트라이드와 오프셋을 계산합니다. 내가 오프셋 얻을 어차피

 glBindBufferARB(GL_ARRAY_BUFFER_ARB, etn.getVboHandel()); 
     glBufferDataARB(GL_ARRAY_BUFFER_ARB, etn.getVboData().capacity() << 2, GL_STATIC_DRAW_ARB); 

     glColorPointer(3, GL_FLOAT, /* stride **/6 << 2, /* offset **/0); 
     glVertexPointer(3, GL_FLOAT, /* stride **/6 << 2, /* offset **/0); 

     glDrawArrays(GL_QUADS, 0, etn.getVboData().capacity());  

및 수정 될 보폭 :

(실제 데이터 바인딩이없는 이유를 참고 메신저 매핑 vbos 이잖아 사용) : 렌더링 할 때 여기에

내 전화입니다 그래서 렌더링 할 때 이상한 유물을 볼 수 있습니다 ..

+1

질문에 답할 수있는 정보가 너무 많습니다. 당신이하려고하는 것이 무엇인지는 명확하지 않습니다. 예를 들어, "3 floats color"란 무엇을 의미합니까? 또한 ARB 접미사를 사용하지 마십시오. 버퍼 객체는 GL 1.5 기능입니다. 그들은 10 년 이상 동안 OpenGL의 핵심이었습니다. –

+0

ARB 내용을 제거했습니다 – Gopgop

답변

3

보폭은 두 튜플 사이의 공간이며 오프셋은 0과 첫 번째 튜플의 첫 번째 모습 사이의 간격입니다

위치에 3 수레와 삼각형에 대한 예를 들면 다음 3는 그래서 정점 포인터가 (처음 세 항목이 위치 있다고 가정) 0의 오프셋 (offset) 한이

glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE, 24, 0); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(1,3, GL_FLOAT, GL_FALSE, 24, (GLvoid*) (sizeof(float)*3)); 
glEnableVertexAttribArray(1); 

처럼 보이는 정상에 수레와 다음은이 모두가 당신의 인터리브 아칸소 것으로 가정 트리플 최초의 컬러

전에 (GLvoid*) (sizeof(float)*3) 세 가지로 GLfloats 될 것입니다 오프셋 포인터 (정점 색상 정점 높은 게재 순위 직후에 오는 가정) 색상의

(24)의 보폭 선이

VVVCCCVVVCCCVVVCCC처럼 구축 등

버텍스 및 일반 정보와 얼굴을 가진 모델을 사용하여 C++에서 매우 간단한 예를 들어

에, 아웃이 코드를 확인할 수 있습니다 http://www.incentivelabs.de/Sourcecode/OpenGL10.zip

+0

문제는 쿼드 캔트가 1 개 이상의 다른 색상 의미를 가짐을 의미합니다. 따라서 모든 4 * 6 버텍스 호출에 1 색만 필요합니다. VVVVVVVVVVVVVVVVVVVVVVVVC – Gopgop

+0

나는 확실히 모르겠지만 색상은 쿼드 단위가 아닌 정점마다 설정해야합니다. 쿼드 (OpenGL에서 평면 임)가 각 정점에 대해 다른 색상을 갖는 경우 색상이 평면에 보간됩니다. 삼각형도 마찬가지입니다. 따라서 쿼드에 단 하나의 색만 있으면 쿼드에 대한 모든 정점에 같은 색이 필요합니다. – glethien

+0

오오 하시 고마워! 다른 남자가 용량에 대해 말한 것을 도와 주실 수 있습니까? – Gopgop

3

을 설명이 실제로 일관되지 않습니다. 정점 당 3 개의 부동 소수점만으로는 3D 위치와 RGB 색상을 설명하기에 충분하지 않습니다. 코드는 당신이 실제로 정점 당 6 개 개의 값이 있으므로, 그것이이 경우에, 그래서 버퍼가,

+0 +4 +8 +12 +16 +20 
0: pos.x pos.y pos.z col.r col.g col.b 
24: pos.x pos.y pos.z col.r col.g col.b 
... 

스트라이드가 동일한 속성의 두 개의 연속적인 값의 "거리"처럼 보일 수 있음을 시사한다 -로 당신은 올바르게 설정했습니다 - 6 * sizeof (GLfloat). 오프셋은 버퍼의 시작을 기준으로 특성의 바이트 오프셋입니다. 나의 예에서는, pos는 0이고, col은 3 * sizeof (GLfloat)이다. 두 속성을 모두 같은 오프셋으로 설정하면 서로 다른 속성에 대해 동일한 데이터를 사용하기 때문에 거의 좋은 생각이 아닙니다.

또한 버퍼 설정이 분명하지 않은 것 같습니다. 라인

glDrawArrays(GL_QUADS, 0, etn.getVboData().capacity()); 

etn.getVboData().capacity() 버퍼 정점의 개수임을 의미한다.당신이 바이트 당 정점 6 *의를 sizeof (GLfloat)가 필요하기 때문에

glBufferDataARB(GL_ARRAY_BUFFER_ARB, etn.getVboData().capacity() << 2, GL_STATIC_DRAW_ARB); 

은 분명히 잘못된 것입니다, 그래서 당신은 데이터의 일부만 복사, 당신은 정의되지 않은 아웃 ouf 버퍼의 데이터를 액세스,이 경우 모든 종류의 이상한 결과가 발생할 수 있습니다.

+0

용량에 대한 부분을 이해하지 못합니다. 자바에서 sizeof가 없기 때문에 더 자세히 설명하고 자바 refrences를 사용할 수 있습니까? – Gopgop

+1

@ gopgop : N 개의 꼭지점이 있다고 가정하면, 6 개의 부동 소수점 (= 정점 당 24 바이트), 버퍼의 크기는 N * 24 바이트입니다. 'glDrawArrays'는 정점의 수를 예상합니다. 따라서, 'glDrawArrays' 호출이 정확하지만'glBufferData'가 맞지 않거나'etn.getglDrawArraysVboData(). capacity()'가 참조하는 것보다'etn.getglDrawArraysVboData(). capacity()'가 꼭지점 수입니다. 버퍼에'capacity/24' 버텍스가 있어야하고 실제로 존재하는 것보다 4 배 더 많은 데이터를 업로드해야하므로 두 라인 모두 잘못된 것보다 버퍼 크기가 바이트 단위 일 것입니다. – derhass

+0

하지만 제가 그것은 24 bufferData에 의해 작동하지 않습니다 나는 인공물의 무리를 얻을 – Gopgop