인덱싱을 사용할 때 VBO에서 법선을 올바르게 렌더링하는 데 약간의 문제가 있습니다. 나는 정상적인 포인터에 대한 나의 오프셋이 잘못된 것이라고 확신하지만, 수학은 나에게 덧붙이는 것처럼 보인다.VBO 조명 및 인덱싱
나는 데이터 저장 방법 : VBO없이
if(UsingVBO == false)
{
glRotatef(Timer.getElapsedTime().asSeconds() * 10, 0, 1, 0);
glBegin(GL_TRIANGLES);
for(int i = 0; i < NumOfF*3; i+=3)
{
glNormal3f(ModelV[ModelI[i]].nx, ModelV[ModelI[i]].ny, ModelV[ModelI[i]].nz);
glVertex3f(ModelV[ModelI[i]].x, ModelV[ModelI[i]].y, ModelV[ModelI[i]].z);
glNormal3f(ModelV[ModelI[i+1]].nx, ModelV[ModelI[i+1]].ny, ModelV[ModelI[i+1]].nz);
glVertex3f(ModelV[ModelI[i+1]].x, ModelV[ModelI[i+1]].y, ModelV[ModelI[i+1]].z);
glNormal3f(ModelV[ModelI[i+2]].nx, ModelV[ModelI[i+2]].ny, ModelV[ModelI[i+2]].nz);
glVertex3f(ModelV[ModelI[i+2]].x, ModelV[ModelI[i+2]].y, ModelV[ModelI[i+2]].z);
}
glEnd();
}
else
{
glRotatef(Timer.getElapsedTime().asSeconds() * 10, 0, 1, 0);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);
glVertexPointer(3, GL_FLOAT, sizeof(MyVertex), 0);
glNormalPointer(GL_FLOAT, sizeof(MyVertex), (void*)(NumOfV*sizeof(float)));//Number of vertices times size of float
glDrawElements(GL_TRIANGLES, NumOfF*3, GL_UNSIGNED_INT, 0);//number of indices
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
}
렌더링 :
GLuint VertexVBOID, IndexVBOID;
glGenBuffers(1, &VertexVBOID);
glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
glBufferData(GL_ARRAY_BUFFER, sizeof(MyVertex)*NumOfV, &ModelV[0].x, GL_STATIC_DRAW);
glGenBuffers(1, &IndexVBOID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*NumOfF*3, &ModelI[0], GL_STATIC_DRAW);
코드 렌더링 내 : 나는 VBO를 설정하는 방법
다음struct MyVertex
{
float x, y, z; //Vertex
float nx, ny, nz; //Normal
};
인을
VBO로 렌더링 :
중복 가능성 (http://stackoverflow.com/questions/11148567/rendering-meshes-with-multiple-indices) –
그래도 꼭지점을 재사용 할 수있는 색인 도구가 필요하지 않습니까? 그게 내가 여기에서 얻은 것입니다 : [link] (http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-9-vbo-indexing/) - "이 튜토리얼에서는 재사용을 가능하게하는 인덱싱을 소개합니다 동일한 꼭지점을 반복해서 반복 할 수 있습니다. 이것은 인덱스 버퍼를 사용하여 수행됩니다. " – LucasS
정점이 위치가 아닙니다. 정점 *에는 위치가 포함되어 있지만 꼭 그런 것은 아닙니다. 법선, 색상, 텍스처 좌표 또는 원하는 속성을가집니다. 정점 공유는 가능하지만 패싯 객체를 렌더링하는 경우 * 아닙니다 *. 당신이하는 방식. 꼭지점이 아닌 꼭지점마다 법선이 필요합니다. –