Jump to content
  • Advertisement
Sign in to follow this  
tmason

OpenGL Small but noticable seam on Skybox...

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

If you intended to correct an error in the post then please contact us.

Recommended Posts

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:

Seams_In_Skybox.png

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

Geometry:
 

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:
 

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:
 

	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:
 

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);

Share this post


Link to post
Share on other sites
Advertisement
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!