Jump to content
  • Advertisement
Sign in to follow this  
MasterGohan

OpenGL Issue with Texture Borders

This topic is 4485 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 everyone… Going to be detailed as possible here, so I apologize on the length. Implementing a Terrain Engine at the moment, however, hit somewhat of a snag with the texturing (or rather ugly seams between tiles). The Terrain Engine’s using VBO’s for the Texture Coordinates, Vertices, etc, so… Looking through the OpenGL documentation it seemed that the easiest way to tackle the problem was to use Texture Borders. Due to that each Texture tile is already sharing vertices with its adjacent tiles; they’re also sharing texture coordinates which I set to repeat back and forth from 0-1-0 … etc. Since everything was in-place other than altering the texture chopping to share a pixel on the border of each tile, I assumed that setting Texture Bordering would be cake…. Yet as things go, it didn’t quite work out that way.. -After expanding each texture to add a border, the entire terrain ended up looking corrupt. ::Where to start in explaining? A picture is worth a thousand words, or so people say:: -- As a side note, I apologize if the server goes down or doesn’t respond. Since I don’t have any immediate access to web hosting, I’m just going to host the images myself. http://71.194.70.104/Snaps/Image1.JPG -- This snapshot shows a tear through the center of the terrain. Interestingly, it only occurs dead center of the terrain and between vertical tiles.. It doesn’t occur at the intersection of any other flipped tiles (aside from the center intersecting that is). http://71.194.70.104/Snaps/Image2.JPG -- This snapshot is looking northward on the terrain from approx dead center. The seam between each neighboring tiles is extremely visible; however, the texture looks at least ‘remotely’ like the original. http://71.194.70.104/Snaps/Image3.JPG -- Now this one was taken just turning the camera around 180 degrees (facing the tiles that were vertically flipped – y coord starting from 1.0). http://71.194.70.104/Snaps/NoBorders.JPG -- And this one is exactly the same texture, but prepared without bordering.. --You’re probably wondering what the heck that texture is… Well, it’s something that I just thought up in hopes that it’d help hint me in the problem’s direction (if I could note a pattern in the texture distortion). int counter=0,counter2; BYTE* pTextureImage=new Uint8[textureWidth*textureHeight*3]; BYTE* pTextureImage_count=pTextureImage; memset(pTextureImage_count,0,textureWidth*textureHeight*3); for (y=0; y<textureHeight; y++) { counter2=0; for (x=0; x<textureWidth; x++) { pTextureImage_count[counter]=255; pTextureImage_count[counter2]=255; pTextureImage_count+=3; counter2++; if (counter2>=3) counter2=0; } counter++; if (counter>=3) counter=0; } The terrain rendered fine without the texture bordering and with Clamping, so I assumed that this was a fairly good indication that the coordinates/textures were fine (No visible seams without filtering).. But to be certain, I went ahead and wrote up a texture viewer to give a better view of the Terrain with Borders Enabled. Unfortunately, the texture viewer didn’t yield much insight into the problem either. http://71.194.70.104/Snaps/Texture.JPG -- Complete Terrain Texture – 515x515 (scanned across at 256+1 intervals) -Note that the viewed textures have flipping already applied to them. So, for instance, the rightmost column of pixels in Tile 1 and 2 should match (Given Tile 2 is flipped horizontally as per the texture coordinates). http://71.194.70.104/Snaps/Cell%200%20(Upper%20Left).JPG -- Tile 1 http://71.194.70.104/Snaps/Cell%201%20(Upper%20Right).JPG – Tile 2 http://71.194.70.104/Snaps/Cell%202%20(Lower%20Left).JPG – Tile 3 http://71.194.70.104/Snaps/Cell%203%20(Lower%20Right).JPG – Tile 4 http://71.194.70.104/Snaps/TexCoords.TIF -- Texture Coordinate layout for the 4 tiles. –The viewer directly reads the 1BYTE aligned texture packing (not using GDI/DIB’s or anything like that), and fetches immediately before an upload.. So, this looking correct at least convinces me that the texture data’s fine. Other observations whenever moving around the terrain: Textures “dim” the further that I walk along them vertically.. Colors become faded out, maximally at about half way, and then return to their prior color intensity on reaching the tile’s other end. ===================================================== Pertaining to the texture creation… glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D,0,3,258,258,1,GL_RGB,GL_UNSIGNED_BYTE,TexData); gluBuild2DMipmaps(GL_TEXTURE_2D,3,258,258,GL_RGB,GL_UNSIGNED_BYTE,TexData); Texture Coordinate Generation:: // Note that VertPerHeight/width are infact exact integer values, there’s no precision being lost. Checked that imediately. Especially after I tried setting the texture to pure white right before upload. http://71.194.70.104/Snaps/FullWhite.JPG -- And here’s the center black rift again, with a pure white texture.. ... m_pTexture=new float[TotalVertices*2]; float u,v; int VertPerHeight=(cx+TilesCX-1)/TilesCX, verticesPerTileHeight=(cy+TilesCY-1)/TilesCY; int k=0,i,jEnd; int yCount=0,xCount; bool xDir,yDir=true; int j; for (i=0; i<TotalVertices; i+=cx) { xCount=0; //------------------------ if (yDir) v=MathInterpolate(0.0f,1.0f,double(yCount)/double(VertPerHeight-1)); else v=MathInterpolate(1.0f,0.0f,double(yCount)/double(VertPerHeight-1)); yCount++; if (yCount>=VertPerHeight) { yDir=!yDir; yCount=1; } //------------------------ xDir=true; // Starting from the left Texture Cell.. jEnd=i+cx; for (j=i; j<jEnd; j++) { //------------------------ if (xDir) u=MathInterpolate(0.0f,1.0f,double(xCount)/double(VertPerWidth-1)); else u=MathInterpolate(1.0f,0.0f,double(xCount)/double(VertPerWidth-1)); xCount++; if (xCount>=VertPerWidth) { xCount=1; xDir=!xDir; } //------------------------ m_pTexture[k++]=u; m_pTexture[k++]=v; } } ... And rendering.. ... glBindBufferARB(GL_ARRAY_BUFFER,VertexVBO); glVertexPointer(3,GL_FLOAT,0,0); glBindBufferARB(GL_ARRAY_BUFFER,NormalsVBO); glNormalPointer(GL_FLOAT,0,0); ... glActiveTextureARB(GL_TEXTURE1_ARB); glMatrixMode(GL_TEXTURE); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glActiveTextureARB(GL_TEXTURE0_ARB); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); glBindTexture(GL_TEXTURE_2D,cell.GetTexID()); cell.Render() ... if (nFanVertices>0) glDrawElements(GL_TRIANGLES,nFanVertices,GL_UNSIGNED_INT,pFanVertices); if (nTriangleVertices>0) glDrawElements(GL_TRIANGLES,nTriangleVertices,GL_UNSIGNED_INT,pTriangleVertices); } ... The source is a mess.. Hopefully it won’t come to it, but if the problem can’t be isolated the next step will be recreating it in a small closed test app. Any suggestions of where to look, or another means to avoid seams without using Texture Bordering, would be greatly appreciated. -Note that I’ve only been working with GL for a few weeks, so specifics in any advice will be of great help. Thanks in advance.

Share this post


Link to post
Share on other sites
Advertisement
1) why such an odd size: 258?? try 2^nx2^n
2) why do you first upload you texture with glTexImage2D and overwrite it with a glumipmap upload?
3) i think the problem is not solvable with borders. try GL_REPEAT instead of GL_CLAMP_TO_EDGE. (why do you want do clamp it??)

Share this post


Link to post
Share on other sites
1) why such an odd size: 258?? try 2^nx2^n

-One of the images shown uses standard power of two textures (the one without borders).

The 258's are 256+2,256+2's -- The 2 pixels being the borders on each side of the image. I was under the impression this was what the documentation claimed should be done for using a texture border.

As per why such small textures? Smaller textures are easier to see in that viewer, given I was too lazy to code scrollbars and instead stretched the texture to fit.

2) why do you first upload you texture with glTexImage2D and overwrite it with a glumipmap upload?

-The listed code is only the traced execution for loading the terrain textures.. May not be the optimal means for everything it does.. However, it's working fine when not using texture borders, and with the Glyphs for the text engine.

3) i think the problem is not solvable with borders. i think you only have to ajust the texcoords but maybe i don't understand you problem.

-I'll take another look at the generation of the Texture Coordinates.

Update - Using GL_REPEAT yields basically the same. Same black bounds through the center, etc.

Update 2 - Traced through the Generation of the Texture Coordinates. The points of overlap are definitely at 1.0 of their respective axis, followed by a flip in direction..

[Edited by - MasterGohan on July 5, 2006 2:01:41 PM]

Share this post


Link to post
Share on other sites
Another Update..

Interesting in that it's now working (kindof).. Yet I'm now even more confused.

Added an Alpha Channel to each Texture Tile and uploaded with GL_RGBA instead of GL_RGB. In doing that, the Texture Bordering is working flawlessly and there's zero seams (as long as Compression is disabled at least).

... Do I need to be working with Alpha whenever using Borders?

--Either way, the issue with "fading" still remains. The further I move vertically along a tile the more faded it becomes until reaching the opposite end's texture coordinates.

Though I'll be continuing searching, any ideas would be appreciated.

I'll be finding another videoboard to put in here as well and see if there's any differences in GL implimentations.

EDIT: -- I'll see if I can get images showing exactly what I mean by "faded".

EDIT2: Alright.. Here's the images. They're TIF this time instead of jpeg for purposes of accurate color.

http://71.194.70.104/Snaps/Upper%20Most%20Boundry.TIF -- A non faded section of the terrain taken from a tile boundry (top bounds of the map)

http://71.194.70.104/Snaps/Faded.TIF -- A faded section of the terrain, taken approx 1/2 way vertically between tiles.

NOTE: The color radiance appears to be consistent across the horizontal axis.



[Edited by - MasterGohan on July 6, 2006 5:34:23 AM]

Share this post


Link to post
Share on other sites
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!