UV sphere model generator for OpenGL 3.x apps. Output is C file with vertex array (VBO data, floats) and index array (EBO data, ints). Each vertex contains 5 floats: coordinates of point on sphere surface and coords of texture next to them. Each unsigned int of Index array is a pointer to vertex. Each index string contains one triangle in first and last sphere layer, or 2 triangles (that are 1 rectangle) in middle layers.
// Init
{
glGenVertexArrays(1, &sphVAO);
glGenBuffers(1, &sphVBO);
glGenBuffers(1, &sphEBO);
glBindVertexArray(sphVAO);
glBindBuffer(GL_ARRAY_BUFFER, sphVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(sphVerts), sphVerts, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, sphEBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(sphIndices), sphIndices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);
}
// In rendering loop
{
glUseProgram(glShaderProgID);
glUniform1i(glGetUniformLocation(glShaderProgID, "sph_tex"), num);
glUniformMatrix4fv(glGetUniformLocation(glShaderProgID, "view"), 1, GL_FALSE, &viewMat[0][0]);
glUniformMatrix4fv(glGetUniformLocation(glShaderProgID, "projection"), 1, GL_FALSE, &projMat[0][0]);
glUniformMatrix4fv(glGetUniformLocation(glShaderProgID, "transform"), 1, GL_FALSE, &transformMat[0][0]);
glActiveTexture(GL_TEXTURE0 + num);
glBindTexture(GL_TEXTURE0 + num, tex_sphere_0);
glBindVertexArray(sphVAO);
glDrawElements(GL_TRIANGLES, sizeof(sphIndices) / sizeof(unsigned int), GL_UNSIGNED_INT, 0);
}
Vertex
#version 330 core
layout (location = 0) in vec3 vPosition;
layout (location = 1) in vec2 vTexCoords;
out vec2 wTexCoords;
uniform mat4 transform;
uniform mat4 view;
uniform mat4 projection;
void main() {
gl_Position = projection * view * transform * vec4(vPosition, 1.f);
wTexCoords = vec2(vTexCoords);
}
Fragment
#version 330 core
in vec2 wTexCoords;
out vec4 FragColor;
uniform sampler2D sph_tex;
void main() {
FragColor = texture(sph_tex, wTexCoords);
}