정점 배열에서 객체를 그리는 일부 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);
그러나 두 프로그램이 같은 코드를 갖고있는 것 같다에도 불구하고, 첫 번째 버전은 큐브를 생성 내가 무엇을 놓치고. 이 점에서?
좋아, 그래서 그 인수를 "sizeof (GLfloat) * 6 * num_vertices"로 변경하면 작동합니다. 그리고 그게 효과가있는 숫자 인 이유를 아직도 이해하지 못한다는 것을 제외하고는 훌륭합니다. 설명해 주시겠습니까? 아니면 설명 할 수있는 리소스를 가르쳐 주시겠습니까? – irishMTS
잠깐만 요, 이제 이해합니다. 배열의 정점마다 6 개의 다른 값이 있습니다. 그냥 가서 각 프로그램의 맥락에서 그 가치들이 실제로 무엇을 의미하는지 알아야합니다. 도와 주셔서 감사합니다! – irishMTS