Curious about cube mapping
BlitzMax Forums/OpenGL Module/Curious about cube mapping
| ||
I'm looking to use OpenGL 1.3 texture combiners and cube maps for a variety of reasons. One reason is to use a `normal map texture` to specify which texels from a cube map will be output. It doesn't need to turn it into a bumpmap or anything, I just need to know what commands cause/imply the reading of a texel from the normal map texture, used AS the normal to find a texel from the cube map. e.g. in the normal map texture, a texel's RGB values are used to store x/y/z vector information (not normalized). How do I simply use this normal, per pixel, as `input` to the lookup of a cube map? ie if the texel's normal says `point over there`, the cube map is then indexed `over there` and returns a cubemap texel?????? Despite all the stuff I've read online and in the OpenGL superbible/red/blue books I just can't seem to figure out what it is that triggers the normals in the texture to be used as normals for indexing the cubemap. Any ideas? |
| ||
This is the article I'm trying to understand: http://nehe.gamedev.net/data/articles/article.asp?article=20 I think I have a better idea of it now. Bumpmap normals are NOT passed to the cube map - they are passed in by the multitexcoord calls, which are per-vertex not per pixel. They get interpolated across the quad. It represents the angle from the light to the quad surface. If the light is positioned directly in front of a vertex the vector would point straight down the z axis (ie have no effect). Then this is dot-producted against the per-pixel bump map AFTER that, to find a new angle and turn it into a range 0..1. I think I get it. But I'm still looking for a way to feed per-pixel normals into a cube map lookup, without using shaders. I'm hoping there is a way using texture combiners. ? |
| ||
Or alternatively, is there a way to just offset a regular 2d texture coordinate based on values in another texture, without shaders? |
| ||
It should be possible as I've seen it done (look for Environment-Mapped BumpMapping - EMBM) Not sure how to implement this within BMAX though (or anywhere else for that matter). I only know the shader way :) Or, alternatively, do it in software (but it's going to be slow). I did this already and you actually helped me optimize it :) SetGraphicsDriver GLMax2DDriver() Graphics(800, 600) Global testImg:TImage = LoadImage("concept_A.jpg") Global normalImg:TImage = LoadImage("normalmap.jpg") Global tempPix:TPixmap Global frameTime:Int tempPix:TPixmap = CreatePixmap(normalImg.width, normalImg.Height, PF_BGRA8888) SetBlend ALPHABLEND Global DeformPix:TPixmap While (Not KeyHit(KEY_ESCAPE)) frameTime = MilliSecs() DrawImage(testImg, 0, 0) DeformPix = GrabPixmap(MouseX(), MouseY(), normalImg.width, normalImg.Height) DrawImageDeform(DeformPix, normalImg, MouseX(), MouseY()) DrawText(MilliSecs() - frameTime, 0, 0) Flip 0 Wend Function DrawImageDeform(pixSrc:TPixmap, imgNormal:TImage, xD:Float, yD:Float) Local pixNrm:TPixmap = LockImage(imgNormal) Local x, y Local n:Int Local xS:Float Local yS:Float Local r:Int, g:Int, b:Int Local w:Int, h:Int w = imgNormal.Width h = imgNormal.Height Local p2:Int ptr = Int ptr(PixmapPixelPtr(pixNrm)) Local d2:Int ptr = Int ptr(PixmapPixelPtr(tempPix, x, y)) For y = 0 To h - 1 For x = 0 To w - 1 n:Int = p2[0] If (n = $FF808080) d2[0] = $00000000 Else r = (n Shr 16) & $ff b = n & $ff xS:Float = x + ((r - 128.0) / 8.0) yS:Float = y + ((b - 128.0) / 8.0) If (xS < 0) Then xS = 0 If (xS > pixSrc.width - 1) Then xS = pixSrc.width - 1 If (yS < 0) Then yS = 0 If (yS > pixSrc.Height - 1) Then yS = pixSrc.Height - 1 d2[0] = ReadPixel(pixSrc, Int(xS), Int(yS)) EndIf p2:+1 d2:+1 Next Next DrawImage(LoadImage(tempPix), xd, yd) End Function This is what I came up with. Not sure if there's anything left to optimize in there (except if you're doing this with a static image, with nothing moving "behind the distortion"), but if there is and you find it, please share it :) |
| ||
Um yah I would need to do it in hardware not with the cpu. It would be applied full-screen every frame so it needs to use something like texture combiners or whatever. ATI actually did come up with a bump mapping texture combiner extension which did exactly what I need to do - ie use offsets in one texture to displace texture coordinate lookups in another texture... but it seems it never really caught on and I haven't seen it supported on any machines. I guess most people who wanted to do bump mapping turned to things like normal maps and shaders. I know you could displace the coords in a shader simple enough but I'd like something that works in ... say, OpenGL 1.4/1.5ish with no shaders. |