저는 OpenGL 프로젝트의 성능을 높이고 고정 기능 렌더링보다 고급 기능을 배우기 위해 VBO를 사용하도록 가르쳐 왔습니다. 그러나 나는보기 흉하지 않은 튜토리얼의 길을 많이 찾지 못했다. 내가 지금까지 찾은 최고의 것들은 Songho's tutorials과 그 것들이 OpenGL.org에있다. 그러나 나는 그것이 무엇인지 정확하게 말할 수는 없지만 어떤 일이 벌어지고 있는지 완전히 이해할 수있는 배경 지식이 빠져있는 것 같다. , 몇 가지 매개 변수의 사용을 저장합니다.VBO를 올바르게 사용하는 법을 배웁니다.
어쨌든 필자는 위조 된 코드를 만들었지 만 적어도 충돌은 발생하지 않지만 기괴한 결과를 초래합니다. 렌더링하고자하는 것은 고정 된 함수를 사용하여 렌더링되며, 갈색과 배경 회색으로되어 있지만 모든 OpenGL 스크린 샷은 마젠타 색을 선호하는 색으로 사용하는 것 같습니다 (아마도 창에 SFML을 사용했기 때문일 수 있습니다).
내가 무엇을 얻을하지만, 이것이다 : 나는 손실에있어
. 여기에 버퍼 오브젝트를 설정하기위한 첫번째, 내가 사용하는 관련 코드입니다 (나는 4~8메가바이트을 할당 this guy's 권고에 따라 많은 양의 메모리를 할당) :
GLuint WorldBuffer;
GLuint IndexBuffer;
...
glGenBuffers(1, &WorldBuffer);
glBindBuffer(GL_ARRAY_BUFFER, WorldBuffer);
int SizeInBytes = 1024 * 2048;
glBufferData(GL_ARRAY_BUFFER, SizeInBytes, NULL, GL_STATIC_DRAW);
glGenBuffers(1, &IndexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBuffer);
SizeInBytes = 1024 * 2048;
glBufferData(GL_ELEMENT_ARRAY_BUFFER, SizeInBytes, NULL, GL_STATIC_DRAW);
그런 다음 버퍼로 데이터를 업로드합니다. CreateVertexArray()는 전달 된 위치의 벡터를 정점 데이터로 채 웁니다. 각 정점은 위치에 대해 3 개의 부동 소수점을 제공하고 일반적인 경우에는 3 개의 부동 소수점을 제공합니다 (다양한 자습서에 대해 가장 혼란스러운 것 중 하나는 실제 형식을 저장하고 전송해야하는 형식입니다 에서 정점 데이터, 이것은 괜찮은 근사처럼 보였다) : 그 후
std::vector<float>* VertArray = new std::vector<float>;
pWorld->CreateVertexArray(VertArray);
unsigned short Indice = 0;
for (int i = 0; i < VertArray->size(); ++i)
{
std::cout << (*VertArray)[i] << std::endl;
glBufferSubData(GL_ARRAY_BUFFER, i * sizeof(float), sizeof(float), &((*VertArray)[i]));
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, i * sizeof(unsigned short), sizeof(unsigned short), &(Indice));
++Indice;
}
delete VertArray;
Indice -= 1;
, 게임 루프에서, 나는이 코드를 사용합니다
glBindBuffer(GL_ARRAY_BUFFER, WorldBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBuffer);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0);
glNormalPointer(GL_FLOAT, 0, 0);
glDrawElements(GL_TRIANGLES, Indice, GL_UNSIGNED_SHORT, 0);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
내가 완전히 정직거야 - 아니에요을 물론 나는 glVertexPointer()
과 glNormalPointer()
의 세 번째 매개 변수가 무엇인지 이해해야합니다 (스트라이드는 by 그러나 Songho은 값 사이에 0 바이트의 오프셋을 사용합니다 (what?) 또는 둘 중 마지막 매개 변수는 무엇입니까? 초기 값은 0이라고합니다. 하지만 그것은 포인터가되어야합니다. 배열의 첫 번째 좌표/표준 값을 얻기 위해 널 포인터를 전달하는 것은 이상하게 보입니다. This guy은 BUFFER_OFFSET(0)
과 BUFFER_OFFSET(12)
을 사용합니다. 그러나이를 시도 할 때 BUFFER_OFFSET()이 정의되지 않았다고 말합니다.
플러스, glDrawElements()
의 마지막 매개 변수는 주소가 있어야하지만, 다시 배경을 제외하고 내가 대신 0의 &IndexBuffer
를 사용하는 경우, Songho 0의 주소를 사용하여, 나는 아무것도 전혀 제공하지 않고 빈 화면을 얻을 .
나를 계몽 할 수 있습니까? 아니면 적어도이 사실을 알 수 있도록 도와 줄 수 있습니까? 감사!
비평과 설명에 감사드립니다! 이번에는 더 많은 성공과 이해로 코드를 수정 해 드리겠습니다. – GarrickW