2016-08-02 4 views
-1

내가 정점 배열 객체 사용하여 OpenGL을 4.1에서 일부 정점과 인덱스를 그리려고립니다 없습니다 다음 VAO을 설정하고 glDrawElements를 사용하여 그린 후의 OpenGL 4.1 : 정점 배열 개체는 아무것도

float vertices[] = {-0.8, -0.8, 0, 0.8, -0.8, 0, 0, 0.8, 0}; 
unsigned int indices[] = { 0, 1, 2 }; 

을() 나는 빈 화면을 얻는다. 또한 원래의 정점 위치와 하드 코드 된 색상을 반환하는 간단한 쉐이더 쌍을 사용해 보았습니다.하지만 운이 좋지 않았습니다. 여기

는 VBO 및 VAO 설정하는 코드입니다 :

unsigned int vertexArray; 
glGenVertexArrays(1, &vertexArray); 
glBindVertexArray(vertexArray); 

unsigned int vertexBufferID; 
unsigned int indexBufferID; 

glGenBuffers(1, &vertexBufferID); 
glGenBuffers(1, &indexBufferID); 

glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID); 
glBufferData(GL_ARRAY_BUFFER, 4 * vertexCount, vertices, GL_STATIC_DRAW); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 4 * vertexCount, 0); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferID); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 4 * indexCount, indices, GL_STATIC_DRAW); 

을 그리고 사용 VAO을 그릴 : 여기

glBindVertexArray(vertexArray); 
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, (void*)0); 

모든 OpenGL을 추적의 호출

// Setup code 

glViewport(0,0,1024,768) 
glGetString(GL_RENDERER)="GeForce GT 540M/PCIe/SSE2" 
glGetString(GL_VENDOR)="NVIDIA Corporation" 
glGetString(GL_VERSION)="4.1.0 NVIDIA 359.46" 
glGetString(GL_SHADING_LANGUAGE_VERSION)="4.10 NVIDIA via Cg compil..." 
glEnable(GL_DEPTH_TEST) 
glDepthFunc(GL_LESS) 
glGenVertexArrays(1,000000000015F9B4) 
glBindVertexArray(1) 
glGenBuffers(1,000000000015F9D4) 
glGenBuffers(1,000000000015F9F4) 
glBindBuffer(GL_ARRAY_BUFFER,1) 
glBufferData(GL_ARRAY_BUFFER,36,000000000015FA48,GL_STATIC_DRAW) 
glEnableVertexAttribArray(0) 
glVertexAttribPointer(0,3,GL_FLOAT,false,36,0000000000000000) 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,2) 
glBufferData(GL_ELEMENT_ARRAY_BUFFER,12,000000000015FA88,GL_STATIC_DRAW) 
glClearColor(0.300000,0.300000,0.400000,1.000000) 

// End of setup, here's the code rendering two frames (they just repeat): 

glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT) 
glBindVertexArray(1) 
glDrawElements(GL_TRIANGLES,3,GL_UNSIGNED_INT,0000000000000000) 
glGetError()=GL_NO_ERROR 
wglSwapBuffers(0000000069011A82)=true 

glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT) 
glBindVertexArray(1) 
glDrawElements(GL_TRIANGLES,3,GL_UNSIGNED_INT,0000000000000000) 
glGetError()=GL_NO_ERROR 
wglSwapBuffers(0000000069011A82)=true 

내가 말할 수있는 것은 모든 튜토리얼에서 내가해야 할 일이 무엇인지 꽤 잘하고있다. 귀가 내 스크린에. 내가 뭘 놓치고 있니?

답변

1

데이터는 배열에 단단히 묶여 있으므로 glVertexAttribPointer의 stride 매개 변수는 0이어야합니다. 그런데 정적 배열을 선언하면 sizeof을 사용하여 다음과 같은 구현 종속적 인 것들 대신에 배열의 크기를 전달해야합니다. 4 * vertexCount :

glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID); 
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferID); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 
+0

대부분 옳았습니다. 0의 보폭은 OpenGL이 배열이 단단히 묶여 있다고 가정하게하고 다른 매개 변수를 기반으로 올바른 보폭 값을 계산합니다. 관계없이 올바른 스트라이드를 전달하는 것은 올바르지 않습니다. 그러나, 나는 보폭 값으로 배열의 길이를 넣었습니다. 물론 작동하지 않습니다.>< – Bartvbl

+0

그건 내가 가리키고있는 것입니다. :) – wasthishelpful