2013-03-09 4 views
0

메쉬의 색상을 변경하려고하지만 작동하지 않습니다. 아래 코드를 살펴보십시오. glBufferSubData를 사용하여 색상을 변경하십시오.

typedef struct{ 
    GLubyte red, green, blue, alpha; 
} MTcolor; 

typedef struct{ 
    GLfloat x, y, z; 
} MTvertex; 

typedef struct{ 
    MTvertex verts; 
    MTcolor colors; 
} MTmesh; 

GLuint vbo; 
GLuint ibo; 

static const MTmesh mesh[] = { 
    { {0, 0, 0}, {0, 0, 255, 255} }, 
    { {1, 1, 0}, {0, 0, 255, 255} }, 
    { {2, 0, 0}, {0, 0, 255, 255} } 
}; 

static const GLushort indices[] = { 
    0, 1, 2 
}; 

은 버퍼

glGenBuffers(1, &vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, sizeof(mesh), mesh, GL_STREAM_DRAW); 

glGenBuffers(1, &ibo); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 

나는 색상을 변경하려면

glEnableClientState(GL_VERTEX_ARRAY); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glVertexPointer(3, GL_FLOAT, sizeof(MTmesh), (void*)offsetof(MTmesh, verts)); 

glEnableClientState(GL_COLOR_ARRAY); 
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(MTmesh), (void*)offsetof(MTmesh, colors)); 

RENDER MAKE 그러나 그것은 작동하지 않습니다. 어떤 아이디어?

MTcolor col[] = { 
    255, 0, 0, 255, 
    255, 0, 0, 255, 
    255, 0, 0, 255 
}; 
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(col), col); 

는 인덱스를 결합하고 VBO를 만들 때 당신은 인터리브 배열 레이아웃을 사용하고

답변

1

그릴 //. OpenGL은 VBO에서 무엇이 무엇인지 알지 못합니다. 단지 많은 바이트 일뿐입니다. glBufferSubData로 VBO 내용을 업데이트하면 'col'배열의 레이아웃이 메쉬 배열의 레이아웃과 일치하지 않으므로 데이터가 엉망입니다.

각 버텍스 속성마다 비 인터리브 레이아웃이나 별도의 VBO를 사용하거나 glMapBuffer를 사용하여 VBO를 클라이언트 주소 공간에 매핑하고 그 내용을 업데이트하십시오.

관련 문제