Texturing Quads

OpenGL breaks quads into triangles when texturing. This creates a visual “line” down the shared edge of the two triangles when texturing. I am trying to create a random quad which always has (0,0), (0,1), (1,1), (1,0) texture coodinates for the four vertices. I am applying a checkerboard texture (which works currently for only parallelograms). I want each of the square widths to remain constant along the edge of the quad (that is, I do not want perspective texturing where the closest square has bigger dimensions than the farther away square).

I have included my code (which was mainly taken from the red OpenGL Programming Guide) to show you my problem:

#include<stdio.h>
#include<stdlib.h>
#include<GL/glut.h>

#define checkImageWidth 64
#define checkImageHeight 64
static GLubyte checkImage[checkImageHeight][checkImageWidth][4];
static GLubyte otherImage[checkImageHeight][checkImageWidth][4];

static GLuint texName[2];

void makeCheckImages(void)
{
int i, j, c;

for(i=0; i&lt;checkImageHeight; i++){
	for(j=0; j&lt;checkImageWidth; j++){
		c = (((i&0x8)==0)^((j&0x8)==0))*255;
		checkImage[i][j][0] = (GLubyte) c;
		checkImage[i][j][1] = (GLubyte) c;
		checkImage[i][j][2] = (GLubyte) c;
		checkImage[i][j][3] = 255;
		c = (((i&0x10)==0)^((j&0x10)==0))*255;
		otherImage[i][j][0] = (GLubyte) c;
		otherImage[i][j][1] = (GLubyte) 0;
		otherImage[i][j][2] = (GLubyte) 0;
		otherImage[i][j][3] = 255;
	}
}

}

void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glClearDepth(1.0);

makeCheckImages();
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

glGenTextures(2, texName);
glBindTexture(GL_TEXTURE_2D, texName[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight,
	0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);

glBindTexture(GL_TEXTURE_2D, texName[1]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight,
	0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);
glEnable(GL_TEXTURE_2D);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-12.0, 12.0, -12.0, 12.0, -1.0, 1.0);

}

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glBindTexture(GL_TEXTURE_2D, texName[0]);
glBegin(GL_QUADS);
	glTexCoord2f(0.0, 0.0); 
	glVertex3f(-7.0, -1.0, 0.0);
	glTexCoord2f(0.0, 1.0); 
	glVertex3f(-5.0, 5.0, 0.0);
	glTexCoord2f(1.0, 1.0); 
	glVertex3f(0.0, 5.0, 0.0);
	glTexCoord2f(1.0, 0.0); 
	glVertex3f(0.0, -1.0, 0.0);
glEnd();

glBindTexture(GL_TEXTURE_2D, texName[1]);
glBegin(GL_QUADS);
	glTexCoord4f(0, 0, 0.0, 1.0);
	glVertex3f(-5, -7, 0.0);
	glTexCoord4f(0, 1, 0.0, 1.0); 
	glVertex3f(-5, -2, 0.0);
	glTexCoord4f(1, 1, 0.0, 1.0); 
	glVertex3f(-2, -2, 0.0);
	glTexCoord4f(1, 0, 0.0, 1.0); 
	glVertex3f(-2, -5, 0.0);
glEnd();

glFlush();

}

int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(700, 700);
glutInitWindowPosition(100, 100);
glutCreateWindow(“hello”);
init();
glutDisplayFunc(display);
glutMainLoop();

return 0;	

}