#### Archived

This topic is now archived and is closed to further replies.

# Possible to make 4 different pictures in a square?

This topic is 5865 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

Is it possible make different picture in each corner of a square? (4 different picture on a square) Some people misunderstood my last message I posted. So I had to make it more clear. If you know how to make it please post your code here. If theres tutorial pls post it here too. Waldoo

##### Share on other sites
Either break the quad into four smaller quads, and draw them with it''s own texture, or combine the four images into one before uploading them to OpenGL. I suggest you go for the first one. There''s no way to get OpenGL to use different textures on different parts of one single primitive.

##### Share on other sites
Bob doesn''t know that you are a newbie. Before you told it, how could we know ?
In some forums, newbies begin each post by the word *NEWBIE* in order to claim that detailed information is needed. You should try that, otherwise don''t expect to have information with as much detail as you look for.

As for being on topic, I won''t post here since the other thread seems to be living...

##### Share on other sites
Could you please post example or tutorial here as requested previously. I am newbie and I need to see the whole thing to understand better.

Waldoo

##### Share on other sites

  A-------B| || || || || |C-------D

You know vertex coordinates A, B, C and D.
OpenGL drawing command may be :
GLfloat A[3] = { /* Write the coordinates of A here */ };
GLfloat B[3] = { /* Write the coordinates of B here */ };
GLfloat C[3] = { /* Write the coordinates of C here */ };
GLfloat D[3] = { /* Write the coordinates of D here */ };
GLuint texture = /* The texture ID is here */;
glBindTexture(GL_TEXTURE_2D, texture);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(A);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(B);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(D);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(C);
glEnd();
/* Note: be careful of the order the the vertices : it is ABDC with GL_QUADS,
but it would be ABCD with GL_QUAD_STRIP */

To split the quad, you have to compute the vertex coordinates E, F, G, H and I and connect the quads as shown below :
  A---E---B| | || | |F---G---H| | || | |C---I---D

corresponding OpenGL drawing command may be :
#define COMPUTE_MIDDLE(_dst,_src1,_src2) {_dst[0]=0.5f*(_src1[0]+_src2[0]);\
_dst[1]=0.5f*(_src1[1]+_src2[1]);\
_dst[2]=0.5f*(_src1[2]+_src2[2]);}
GLfloat A[3] = { /* Write the coordinates of A here */ };
GLfloat B[3] = { /* Write the coordinates of B here */ };
GLfloat C[3] = { /* Write the coordinates of C here */ };
GLfloat D[3] = { /* Write the coordinates of D here */ };
GLfloat E[3], F[3], G[3], H[3], I[3];
GLuint texture[4] = { /* The texture IDs are here */ };
COMPUTE_MIDDLE(E,A,B);
COMPUTE_MIDDLE(F,A,C);
COMPUTE_MIDDLE(G,A,D);
COMPUTE_MIDDLE(H,B,D);
COMPUTE_MIDDLE(I,C,D);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(A);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(E);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(G);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(F);
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[1]);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(E);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(B);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(H);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(G);
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[2]);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(F);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(G);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(I);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(C);
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[3]);
glTexCoord2f(0.0f, 1.0f); glVertex3fv(G);
glTexCoord2f(1.0f, 1.0f); glVertex3fv(H);
glTexCoord2f(1.0f, 0.0f); glVertex3fv(D);
glTexCoord2f(0.0f, 0.0f); glVertex3fv(I);
glEnd();
/*Be careful : now the texture id is in an array. */

##### Share on other sites
Yes thank you. I have one more question how do you load several images for array glBindTexture?

Waldoo

##### Share on other sites
To generate textures in OpenGL, do this :

GLuint texture[4];
glGenTextures(4, &texture[0]);

it will create 4 textures in OpenGL.

To initialize them, do this :

glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexImage2d(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, (const GLvoid*)pixels);

where width is the width (in pixels) of the first texture (eg texture[0]), height is the height (in pixels) of the first texture, and pixels is an array of bytes which contain RGB information of the texture : GLubyte pixels[height][width][3];

Repeat the same operation for the 3 other textures :
glBindTexture(GL_TEXTURE_2D, texture[1]);
glTexImage2d(...

Note that you will probably have different width and height for each texture.

Important : height and width must be a power of two (eg, something like 16, 32, 256, etc, but NOT something like 100, 200 or 500).

Thank you!!

Waldoo