Reputation: 490
I have an opengl cube and I want to texture all 6 faces.
Do I need multiple textures?
Here's a screenshot of the current cube:
basically I don't know how to wrap the texture around the entire cube...
here's my cube.h header file where the IBO's and VBO's are defined
#pragma once
#include <GL\glew.h>
class cube {
public:
cube() {
x = 0;
y = 0;
z = 0;
width = 0;
vertices = 0;
indices = 0;
}
cube(GLfloat X, GLfloat Y, GLfloat Z, float w) {
x = X;
y = Y;
z = Z;
width = w;
vertices = new GLfloat[40];
//1
vertices[0] = x; //x pos
vertices[1] = y; //y pos
vertices[2] = z; //z pos
vertices[3] = 0; //x pos in texture
vertices[4] = 1; //y pos in texture
//2
vertices[5] = x + width;
vertices[6] = y;
vertices[7] = z;
vertices[8] = 1;
vertices[9] = 1;
//3
vertices[10] = x;
vertices[11] = y - width;
vertices[12] = z;
vertices[13] = 0;
vertices[14] = 0;
//4
vertices[15] = x + width;
vertices[16] = y - width;
vertices[17] = z;
vertices[18] = 1;
vertices[19] = 0;
//5
vertices[20] = x;
vertices[21] = y;
vertices[22] = z - width;
vertices[23] = 0;
vertices[24] = 1;
//6
vertices[25] = x + width;
vertices[26] = y;
vertices[27] = z - width;
vertices[28] = 1;
vertices[29] = 1;
//7
vertices[30] = x;
vertices[31] = y - width;
vertices[32] = z - width;
vertices[33] = 0;
vertices[34] = 0;
//8
vertices[35] = x + width;
vertices[36] = y - width;
vertices[37] = z - width;
vertices[38] = 1;
vertices[39] = 0;
//indices
indices = new unsigned int[36];
//0
indices[0] = 0;
indices[1] = 1;
indices[2] = 2;
//1
indices[3] = 1;
indices[4] = 2;
indices[5] = 3;
//2
indices[6] = 4;
indices[7] = 5;
indices[8] = 6;
//3
indices[9] = 5;
indices[10] = 6;
indices[11] = 7;
//4
indices[12] = 4;
indices[13] = 0;
indices[14] = 1;
//5
indices[15] = 4;
indices[16] = 5;
indices[17] = 1;
//6
indices[18] = 6;
indices[19] = 2;
indices[20] = 3;
//7
indices[21] = 6;
indices[22] = 7;
indices[23] = 3;
//8
indices[24] = 1;
indices[25] = 5;
indices[26] = 3;
//9
indices[27] = 5;
indices[28] = 7;
indices[29] = 3;
//10
indices[30] = 4;
indices[31] = 0;
indices[32] = 2;
//11
indices[33] = 4;
indices[34] = 6;
indices[35] = 2;
}
GLfloat* vertices;
unsigned int* indices;
private:
GLfloat x;
GLfloat y;
GLfloat z;
float width;
};
all this code does is set up a simple VBO and IBO/EBO for a cube object to later be used.
Upvotes: 4
Views: 2082
Reputation: 51835
the problem is that each cube vertex is shared among 3 faces in which its texture coordinate might not be the same. So you either duplicate such vertexes (each with different texture coordinate) or use 2 separate indices (one for vertex and one for texture).
The duplication might look like this (using GL_QUADS
primitive):
double cube[]=
{
// x, y, z, s, t,
+1.0,-1.0,-1.0,0.0,1.0,
-1.0,-1.0,-1.0,1.0,1.0,
-1.0,+1.0,-1.0,1.0,0.0,
+1.0,+1.0,-1.0,0.0,0.0,
-1.0,+1.0,-1.0,0.0,0.0,
-1.0,-1.0,-1.0,0.0,1.0,
-1.0,-1.0,+1.0,1.0,1.0,
-1.0,+1.0,+1.0,1.0,0.0,
-1.0,-1.0,+1.0,0.0,1.0,
+1.0,-1.0,+1.0,1.0,1.0,
+1.0,+1.0,+1.0,1.0,0.0,
-1.0,+1.0,+1.0,0.0,0.0,
+1.0,-1.0,-1.0,1.0,1.0,
+1.0,+1.0,-1.0,1.0,0.0,
+1.0,+1.0,+1.0,0.0,0.0,
+1.0,-1.0,+1.0,0.0,1.0,
+1.0,+1.0,-1.0,0.0,1.0,
-1.0,+1.0,-1.0,1.0,1.0,
-1.0,+1.0,+1.0,1.0,0.0,
+1.0,+1.0,+1.0,0.0,0.0,
+1.0,-1.0,+1.0,0.0,0.0,
-1.0,-1.0,+1.0,1.0,0.0,
-1.0,-1.0,-1.0,1.0,1.0,
+1.0,-1.0,-1.0,0.0,1.0,
};
With this texture:
And this (sory for old GL api but its easier to test with):
int i,n=sizeof(cube)/(sizeof(cube[0]));
glColor3f(1.0,1.0,1.0);
scr.txrs.bind(txr);
glBegin(GL_QUADS);
for (i=0;i<n;i+=5)
{
glTexCoord2dv(cube+i+3);
glVertex3dv(cube+i+0);
}
glEnd();
scr.txrs.unbind();
I got this result:
Upvotes: 2