Thanks for your answer, I have made slight adaptations to my loopMenu function, as well as updating testVertex.glsl; my drawing code which shows how my texture coords are set up is also here.
I know it’s a lot of code so thanks again for taking the time to look through it all.
My OpenGL version is 3.1.0, so it should be high enough to do this, no?
relevant parts of draw.c and draw.h:
typedef struct {
float s;
float t;
} textureCoord;
typedef struct {
float x;
float y;
float z;
} vertexLocation;
typedef struct {
vertexLocation vertLo;
textureCoord textCo;
} vertex;
typedef struct {
GLuint VBOIndex;
vertex *vertices;
int vertexCount;
} VBO;
short createRectangeVBO(VBO *object, int width, int height) {
object->vertices = NULL;
object->vertices = malloc(4 * sizeof(vertex));
if(object->vertices == NULL) return 0;
object->vertexCount = 4;
if(!generateRectangleVerts(object, width, height)) return 0;
if(!generateRectangleTextureCoords(object)) return 0;
storeVBO(object);
return 1;
}
short generateRectangleVerts(VBO *object, int width, int height) {
if(object->vertexCount != 4) return 0;
object->vertices[0].vertLo.x = 0.0f;
object->vertices[0].vertLo.y = 0.0f;
object->vertices[0].vertLo.z = 0.0f;
object->vertices[1].vertLo.x = width;
object->vertices[1].vertLo.y = 0.0f;
object->vertices[1].vertLo.z = 0.0f;
object->vertices[2].vertLo.x = width;
object->vertices[2].vertLo.y = height;
object->vertices[2].vertLo.z = 0.0f;
object->vertices[3].vertLo.x = 0.0f;
object->vertices[3].vertLo.y = height;
object->vertices[3].vertLo.z = 0.0f;
return 1;
}
short generateRectangleTextureCoords(VBO *object) {
object->vertices[0].textCo.s = 0;
object->vertices[0].textCo.t = 0;
object->vertices[1].textCo.s = 1;
object->vertices[1].textCo.t = 0;
object->vertices[2].textCo.s = 1;
object->vertices[2].textCo.t = 1;
object->vertices[3].textCo.s = 0;
object->vertices[3].textCo.t = 1;
return 1;
}
void storeVBO(VBO *object) {
glGenBuffers(1, &object->VBOIndex);
glBindBuffer(GL_ARRAY_BUFFER, object->VBOIndex);
glBufferData(GL_ARRAY_BUFFER, object->vertexCount * sizeof(vertex), object->vertices, GL_STATIC_DRAW);
}
void drawVBO(VBO *object) {
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, object->VBOIndex);
glVertexPointer(3, GL_FLOAT, sizeof(vertex), NULL);
glTexCoordPointer(2, GL_FLOAT, sizeof(vertex), (void *)(3 * sizeof(float)));
glDrawArrays(GL_QUADS, 0, object->vertexCount);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
void freeVBO(VBO *object) {
object->vertexCount = 0;
free(object->vertices);
}
testVertex.glsl:
void main() {
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = gl_Vertex;
}
testFragment.glsl:
uniform sampler2D textureS;
void main(void) {
gl_FragColor = texture2D(textureS, gl_TexCoord[0].st);
//gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
}
menu.c:
VBO menuBackground;
short titleShader = 0;
short initMenu(void) {
if(!loadTexture(binary_title_jpg_start, (size_t)binary_title_jpg_size, &titleTexture, SOIL_FLAG_COMPRESS_TO_DXT)) {
return 0;
}
if(!createRectangeVBO(&menuBackground, getWidth(), getHeight())) {
return 0;
}
titleShader = compileShaders(binary_testVertex_glsl_start, (size_t)binary_testVertex_glsl_size, binary_testFragment_glsl_start, (size_t)binary_testFragment_glsl_size);
if(!titleShader) {
return 0;
}
return 1;
}
void loopMenu(void) {
glUseProgram(titleShader);
glActiveTexture(GL_TEXTURE0);
int textureSampler = glGetUniformLocation(titleShader, "textureS");
glUniform1i(textureSampler, 0);
glBindTexture(GL_TEXTURE_2D, titleTexture);
drawVBO(&menuBackground);
glUseProgram(0);
}
void deinitMenu(void) {
freeVBO(&menuBackground);
}