2017-11-02 6 views
1

내 목표는 다른 색상과 가능한 경우 다양한 너비의 VBO를 사용하여 세그먼트 목록을 렌더링하는 것입니다. 세그먼트를 정의하는 정점의 쌍VBO를 사용하여 다른 너비의 컬러 선을 그립니까?

class Vector2f { 
public: 
    float x, y; 
}; 

세그먼트의리스트로 구성

각 정점

은에 의해 정의된다.

는 다음 나는 VBO 초기화 :

glGenBuffers(1, &vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, sizeof(Vector2f) * segments.size(), &segments[0], GL_DYNAMIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

을 그리고 내가 사용하여 그리는 : 내 예에서

glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(2, GL_FLOAT, sizeof(Vector2f), (void*)(sizeof(float) * 0)); 
glColor3f(0.0f, 1.0f, 0.0f); 
glDrawArrays(GL_LINES, 0, segments.size()); 
glDisableClientState(GL_VERTEX_ARRAY); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

, 나는 각 세그먼트에 색상을주고 싶다. 색상은 이전에 정의되었으므로 3 가지 옵션 중 하나만 사용할 수 있습니다. 어떻게해야합니까? 그리고 그것을 모두 반복하지 않고 색인을 사용하여 최적화 할 수 있습니까?

그렇다면 어떻게됩니까?

또한 개별 세그먼트의 너비를 정의 할 수 있습니까?

답변

2

어떻게하면됩니까?

class Vector2f 
{ 
public: 
    float x, y; 
    unsigned char r, g, b; 
}; 

그리고 GL_COLOR_ARRAY + glColorPointer() 사용 :

하는 컬러 값을 포함하는 정점 구조체 연장 또한

glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY); 
glVertexPointer(2, GL_FLOAT, sizeof(Vector2f), offsetof(Vector2f, x)); 
glColorPointer(3, GL_UNSIGNED_BYTE, sizeof(Vector2f), offsetof(Vector2f, r)); 
glDrawArrays(GL_LINES, 0, segments.size()); 
glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_COLOR_ARRAY); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

를, 각각 개별 세그먼트의 폭을 정의 할 수있다 ?

고정 기능이있는 것은 아닙니다. 세그먼트 당 드로어 호출 (드로 콜을 일괄 처리하는 것이 성능 상실) 또는 CPU 상에 converting the line into triangle geometry (상당히 복잡합니다) 중 하나가 발생합니다.

+0

그래서 색인을 사용하여 색상 배열을 최적화 할 수 없습니까? – gdf31

+0

@ gdf31 : 사실 OpenGL은 각 속성에 대해 별도의 색인 배열을 허용하지 않습니다. – genpfault

+0

@ gdf31 : 솔직히 말해서 데스크톱을 목표로한다면 OpenGL 정점 데이터는 소수의 텍스처와 비교하면 현미경입니다. – genpfault