Hello,

So I implemented skyboxes in the environment I am building and so far success with the exception of a very small seam appearing on the edges.

How do I get rid of the seams?

Image:



Here are the basics for how I am creating the SkyBox.

Geometry:

Code :
Vertices = new GLfloat[72]
	{
		// Front face
		50.0f, 50.0f, 50.0f,
			50.0f, -50.0f, 50.0f,
			-50.0f, 50.0f, 50.0f,
			-50.0f, -50.0f, 50.0f,
			// Back face
			-50.0f, 50.0f, -50.0f,
			-50.0f, -50.0f, -50.0f,
			50.0f, 50.0f, -50.0f,
			50.0f, -50.0f, -50.0f,
			// Left face
			-50.0f, 50.0f, 50.0f,
			-50.0f, -50.0f, 50.0f,
			-50.0f, 50.0f, -50.0f,
			-50.0f, -50.0f, -50.0f,
			// Right face
			50.0f, 50.0f, -50.0f,
			50.0f, -50.0f, -50.0f,
			50.0f, 50.0f, 50.0f,
			50.0f, -50.0f, 50.0f,
			// Top face
			-50.0f, 50.0f, -50.0f,
			50.0f, 50.0f, -50.0f,
			-50.0f, 50.0f, 50.0f,
			50.0f, 50.0f, 50.0f,
			// Bottom face
			50.0f, -50.0f, -50.0f,
			-50.0f, -50.0f, -50.0f,
			50.0f, -50.0f, 50.0f,
			-50.0f, -50.0f, 50.0f
 
	};
 
	NumOfVertices = 72;
 
	Normals = new GLfloat[72] {
 
		0.0f, 0.0f, -1.0f,
			0.0f, 0.0f, 1.0f,
			1.0f, 0.0f, 0.0f,
			-1.0f, 0.0f, 0.0f,
 
			0.0f, -1.0f, 0.0f,
			0.0f, 1.0f, 0.0f,
			0.0f, 0.0f, -1.0f,
			0.0f, 0.0f, 1.0f,
 
			1.0f, 0.0f, 0.0f,
			-1.0f, 0.0f, 0.0f,
			0.0f, -1.0f, 0.0f,
			0.0f, 1.0f, 0.0f,
 
			0.0f, 0.0f, -1.0f,
			0.0f, 0.0f, 1.0f,
			1.0f, 0.0f, 0.0f,
			-1.0f, 0.0f, 0.0f,
 
			0.0f, -1.0f, 0.0f,
			0.0f, 1.0f, 0.0f,
			0.0f, 0.0f, -1.0f,
			0.0f, 0.0f, 1.0f,
 
			1.0f, 0.0f, 0.0f,
			-1.0f, 0.0f, 0.0f,
			0.0f, -1.0f, 0.0f,
			0.0f, 1.0f, 0.0f
 
	};
 
	NumOfNormals = 72;
 
	TextureCoordinates = new GLfloat[48] {
 
		0.0f, 1.0f,
			0.0f, 0.0f,
			1.0f, 1.0f,
			1.0f, 0.0f,
 
			0.0f, 1.0f,
			0.0f, 0.0f,
			1.0f, 1.0f,
			1.0f, 0.0f,
 
			0.0f, 1.0f,
			0.0f, 0.0f,
			1.0f, 1.0f,
			1.0f, 0.0f,
 
			0.0f, 1.0f,
			0.0f, 0.0f,
			1.0f, 1.0f,
			1.0f, 0.0f,
 
			0.0f, 1.0f,
			0.0f, 0.0f,
			1.0f, 1.0f,
			1.0f, 0.0f,
 
			0.0f, 1.0f,
			0.0f, 0.0f,
			1.0f, 1.0f,
			1.0f, 0.0f
 
	};
 
	NumOfTextureCoordinates = 48;
 
	ModelMatrix = glm::mat4(1.0f);

Textures:

Code :
GLuint WidthOfTexture = 0;
	GLuint HeightOfTexture = 0;
	GLuint BytesPerPixel = 0;
 
 
	FIBITMAP *loadedImage = NULL;
	FREE_IMAGE_FORMAT CurrentFormat = FIF_UNKNOWN;
	CurrentFormat = FreeImage_GetFileType(PathToTexture->c_str(), 0);
 
	if (CurrentFormat == FIF_UNKNOWN) {
		FREE_IMAGE_FORMAT CurrentFormat = FreeImage_GetFIFFromFilename(PathToTexture->c_str());
	}
 
	if (CurrentFormat == FIF_UNKNOWN) {
		return false;
	}
 
	if (FreeImage_FIFSupportsReading(CurrentFormat)) {
		loadedImage = FreeImage_Load(CurrentFormat, PathToTexture->c_str());
	}
 
	if (!loadedImage) {
		return false;
	}
 
	BYTE* bytesDataPointer = FreeImage_GetBits(loadedImage);
	WidthOfTexture = FreeImage_GetWidth(loadedImage);
	HeightOfTexture = FreeImage_GetHeight(loadedImage);
	BytesPerPixel = FreeImage_GetBPP(loadedImage);
 
	if (WidthOfTexture == 0 || HeightOfTexture == 0 || BytesPerPixel == 0) {
		return false;
	}
 
	glGenTextures(1, &TextureObject_ID);   // section being edited by CKoeber to pull in material files
	glActiveTexture(GL_TEXTURE1);
	glBindTexture(GL_TEXTURE_2D, TextureObject_ID);
	GLsizei iFormat = BytesPerPixel == 24 ? GL_BGR : BytesPerPixel == 8 ? GL_LUMINANCE : 0;
	GLsizei iInternalFormat = BytesPerPixel == 24 ? GL_RGB : GL_DEPTH_COMPONENT;
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
		WidthOfTexture, HeightOfTexture, 0, iFormat,
		GL_UNSIGNED_BYTE, bytesDataPointer);
	glGenerateMipmap(GL_TEXTURE_2D);
	FreeImage_Unload(loadedImage);
	glGenSamplers(1, &TextureSamplerObject_ID);
 
	/*
 
	We clamp to edge here versus wrapping for SkyBoxes.
 
	*/
 
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 
	/*
 
	End clamp.
 
	*/
 
	setFiltering(TEXTURE_FILTER_MAG_BILINEAR, TEXTURE_FILTER_MIN_BILINEAR);
	glBindTexture(GL_TEXTURE_2D, NULL);
	glActiveTexture(GL_TEXTURE0);
	return true;

Loading Geometry into OpenGL:

Code :
	glGenVertexArrays(1, &VertextArrayObjectID);
	glBindVertexArray(VertextArrayObjectID);
 
	if (NumOfTextureCoordinates > 0 && NumOfNormals > 0) {
 
		GLuint TotalBufferData = (sizeof(GLfloat)* NumOfVertices) +
			(sizeof(GLfloat)* NumOfNormals) +
			(sizeof(GLfloat)* NumOfTextureCoordinates);
 
		glGenBuffers(1, &MainBufferID);
		glBindBuffer(GL_ARRAY_BUFFER, MainBufferID);
		glBufferData(GL_ARRAY_BUFFER, TotalBufferData, NULL, GL_STATIC_DRAW);
 
	}
	else if (NumOfNormals > 0) {
 
		GLuint TotalBufferData = (sizeof(GLfloat)* NumOfVertices) +
			(sizeof(GLfloat)* NumOfNormals);
 
		glGenBuffers(1, &MainBufferID);
		glBindBuffer(GL_ARRAY_BUFFER, MainBufferID);
		glBufferData(GL_ARRAY_BUFFER, TotalBufferData, NULL, GL_STATIC_DRAW);
 
	}
	else {
 
		GLuint TotalBufferData = (sizeof(GLfloat)* NumOfVertices);
 
		glGenBuffers(1, &MainBufferID);
		glBindBuffer(GL_ARRAY_BUFFER, MainBufferID);
		glBufferData(GL_ARRAY_BUFFER, TotalBufferData, NULL, GL_STATIC_DRAW);
 
	}
 
	glBufferSubData(GL_ARRAY_BUFFER, NULL, sizeof(GLfloat)* NumOfVertices, Vertices);
 
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
	glEnableVertexAttribArray(0);
 
	if (NumOfNormals > 0) {
 
		glBufferSubData(GL_ARRAY_BUFFER,
			sizeof(GLfloat)* NumOfVertices,
			sizeof(GLfloat)* NumOfNormals,
			Normals);
 
		glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(sizeof(GLfloat)* NumOfVertices));
		glEnableVertexAttribArray(1);
 
	}
 
	if (NumOfTextureCoordinates > 0) {
 
		glBufferSubData(GL_ARRAY_BUFFER,
			(sizeof(GLfloat)* NumOfVertices) + (sizeof(GLfloat)* NumOfNormals),
			sizeof(GLfloat)* NumOfTextureCoordinates,
			TextureCoordinates);
 
		glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0,
			(GLvoid*)((sizeof(GLfloat)* NumOfVertices) + (sizeof(GLfloat)* NumOfNormals)));
		glEnableVertexAttribArray(2);
 
	}
 
	glBindVertexArray(NULL);

And drawing:

Code :
ModelMatrix = glm::mat4(1.0f);
 
		ModelMatrix = glm::translate(ModelMatrix, glm::vec3(glm::inverse((*ViewMatrix))[3]));
 
		MVPMatrix = (*ProjectionMatrix) * (*ViewMatrix) * ModelMatrix;
 
		NormalMatrix = glm::transpose(glm::inverse(glm::mat3(MVPMatrix)));
		glBindVertexArray(VertextArrayObjectID);
 
		glUniformMatrix4fv((*AssociatedOpenGLProgram->GetMVPMatrixID()), 1, GL_FALSE, glm::value_ptr(MVPMatrix));
		glUniformMatrix3fv((*AssociatedOpenGLProgram->GetNormalMatrixID()), 1, GL_FALSE, glm::value_ptr(NormalMatrix));
 
		AssociatedOpenGLProgram->SetDrawingSkyBox(true);
 
		glDepthMask(NULL);
 
		for (GLuint i = 0; i < 6; ++i)
		{
			glUniform1i((*AssociatedOpenGLProgram->GetTextureSamplerID()), 1);
			SkyBoxMaterials[i]->BindTexture(1);
			glDrawArrays(GL_TRIANGLE_STRIP, i * 4, 4);
		}
 
		glBindTexture(GL_TEXTURE_2D, NULL);
 
		AssociatedOpenGLProgram->SetDrawingSkyBox(false);
 
		glDepthMask(1);