2016-10-16 3 views
1

정점 배열에서 객체를 그리는 일부 OpenGL 코드를 가져 와서 클래스 파일에 추가하려고 시도 중입니다. 그러나 코드는 main.cpp 파일에있을 때만 현재 실행됩니다. 내 draw 루프를 시작하기 전에 main() 함수에서 init()을 호출합니다.외부 함수에 OpenGL 코드를 올바르게 추가하는 방법

init(){ 
    GLuint containerVAO, VBO; 
    glGenVertexArrays(1, &containerVAO); 
    glGenBuffers(1, &VBO); 

    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

    glBindVertexArray(containerVAO); 
    // Position attribute 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0); 
    glEnableVertexAttribArray(0); 
    // Normal attribute 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat),(GLvoid*)(3 * sizeof(GLfloat))); 
    glEnableVertexAttribArray(1); 
    glBindVertexArray(0); 
} 

내 무승부 루프에서 관련 코드 :

glUseProgram(noTextureShaderID); 
glBindVertexArray(containerVAO); 
///many different uniforms added here 
glDrawArrays(GL_TRIANGLES, 0, 36); 

이 큐브 아무 문제를 만듭니다.

init(){ 
    square.init(noTextureShaderID, vertices[], NULL, 36); 
    //Square is a global variable within my main.cpp file 
} 

을 그리고 나는이 기능을 사용하십시오 : 나는 모든 객체뿐만 아니라이 하나를 초기화합니다 내 초기화() 함수 (내부 코드를 교체 할 때 지금, 나는이로 변경

void Mesh::init(const GLuint& shaderid, GLfloat vertices[], const char* tex_file, int num_vertices) 
{ 
GLuint VBO; 
vao = NULL; //This is a variable within the Mesh class 
g_point_count = num_vertices; 
glGenVertexArrays(1, &vao); 
glGenBuffers(1, &VBO); 

glBindBuffer(GL_ARRAY_BUFFER, VBO); 
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

glBindVertexArray(vao); 
// Position attribute 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0); 
glEnableVertexAttribArray(0); 
// Normal attribute 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat))); 
glEnableVertexAttribArray(1); 
glBindVertexArray(0); 
} 

그런 다음 내 그리기 기능에 내가 대신 전화 :

glUseProgram(noTextureShaderID); 
glBindVertexArray(square.vao); 
///many different uniforms added here 
glDrawArrays(GL_TRIANGLES, 0, g_point_count); 

그러나 두 프로그램이 같은 코드를 갖고있는 것 같다에도 불구하고, 첫 번째 버전은 큐브를 생성 내가 무엇을 놓치고. 이 점에서?

답변

4

귀하의 코드는 두 경우 모두 동일하지, 이것은 OpenGL을과 아무 상관이 없습니다 :

void Mesh::init(const GLuint& shaderid, GLfloat vertices[], const char* tex_file, int num_vertices) 
{ 
    // ... 
    glBufferData(..., sizeof(vertices), ...); 
} 

vertices 여기에 참조에 의해 전달되어, 내부 함수는 배열을 보지 못할 것이며, sizeof(vertices)은 동일합니다 to sizeof(GLfloat*)으로, 이는 일반적으로 오늘날의 기계에서 4 또는 8입니다. 따라서 버퍼에는 첫 번째 또는 두 개의 부동 소수점이 포함됩니다.

배열 매개 변수를 명시 적으로 추가 매개 변수로 제공하거나 std:vector과 같은 상위 수준 개체 (일부 참조)를 사용하면 배열을 내부적으로 완전히 관리하고 크기를 쿼리 할 수 ​​있습니다.

+0

좋아, 그래서 그 인수를 "sizeof (GLfloat) * 6 * num_vertices"로 변경하면 작동합니다. 그리고 그게 효과가있는 숫자 인 이유를 아직도 이해하지 못한다는 것을 제외하고는 훌륭합니다. 설명해 주시겠습니까? 아니면 설명 할 수있는 리소스를 가르쳐 주시겠습니까? – irishMTS

+0

잠깐만 요, 이제 이해합니다. 배열의 정점마다 6 개의 다른 값이 있습니다. 그냥 가서 각 프로그램의 맥락에서 그 가치들이 실제로 무엇을 의미하는지 알아야합니다. 도와 주셔서 감사합니다! – irishMTS

관련 문제