In Bmax you dont have to detect them, you only need to check the support string for this extension and if it is not supported you have to find a work around.
Here is a small code snippet how I'm currently implementing them in miniB3D (yes they already work) ;)
Import klepto.MiniB3D
Local width=1024,height=768,depth=16,mode=0
Graphics3D width,height,depth,mode
ClearTextureFilters()
Local cam:TCamera=CreateCamera()
PositionEntity cam,0,10,-15
Local light = CreateLight(1)
PositionEntity light,20,10,0
Local ent = LoadMesh("media/teapot.b3d")
PositionEntity(ent,0,4,0)
Local Plane:TMEsh = LoadMesh("media/grid.b3d")
EntityColor Plane,128,52,12
PointEntity light ,ent
TurnEntity light,0,45,0
Local SunPlane:TMesh = CreateCube()
PositionEntity sunplane , 12 , 8 , 0
ScaleEntity sunplane ,3,1,3
Local T:Float = 0
Local testtex:TTexture = CreateTexture(512,512,1,1)
EntityTexture sunplane,testtex
Global rb:Int[1]
Global fb:Int[1]
Function InitRenderToTexture(Texture:TTexture)
glGenFramebuffersEXT(1, fb )
glGenRenderbuffersEXT(1 , rb)
glGenTextures(1, texture.gltex)
glBindTexture(GL_TEXTURE_2D, texture.gltex[0]);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT , fb[0]) ;
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 512, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, Null);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, texture.gltex[0], 0);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rb[0]);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, 512, 512);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT , GL_DEPTH_ATTACHMENT_EXT , GL_RENDERBUFFER_EXT , rb[0])
Local status:Int = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT)
Select status
Case GL_FRAMEBUFFER_COMPLETE_EXT
Print "all right" + " : " + Status
Case GL_FRAMEBUFFER_UNSUPPORTED_EXT
Print "choose different formats"
Default
End
EndSelect
End Function
Function RenderToTexture(texture:TTexture)
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT , fb[0]) ;
RenderWorld
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT , 0)
End Function
InitRenderToTexture(testtex)
While Not(KeyDown(KEY_ESCAPE) Or AppTerminate() )
MoveEntity ent,Sin(t*10)*0.1,Cos(t*10)*0.1,Sin(t*10)*0.1
TurnEntity sunplane,0.5,0.5,0.5
T:+0.5
mxs#=mxs#+(MouseXSpeed()/5.0)
mys#=mys#+(MouseYSpeed()/5.0)
RotateEntity cam , mys# , - mxs# , 0
MoveMouse width/2,height/2
MouseXSpeed()
MouseYSpeed()
If KeyDown(KEY_UP)=True Then MoveEntity Cam,0,0,0.5 ;' move camera forward
If KeyDown(KEY_DOWN)=True Then MoveEntity Cam,0,0,-0.5# ' move camera back
If KeyDown(KEY_LEFT)=True Then MoveEntity Cam,-0.5#,0,0 ' move camera left
If KeyDown(KEY_RIGHT)=True Then MoveEntity Cam,0.5#,0,0 ' move camera Right
Local x2:Float = EntityX(cam)
Local y2:Float = EntityY(cam)
Local z2:Float = EntityZ(cam)
Local rx:Float = EntityPitch(cam)
Local ry:Float = EntityYaw(cam)
Local rz:Float = EntityRoll(cam)
CameraViewport(cam,0,0,1024,1024)
cam.PositionEntity(EntityX(light),EntityY(light),EntityX(light) )
cam.RotateEntity(EntityPitch(light), EntityYaw(light), EntityRoll(light) )
RenderWorld
RenderToTexture(testtex)
cam.PositionEntity(x2,y2,z2)
cam.RotateEntity(rx,ry,rz)
CameraViewport(Cam,0,0,1024,768)
RenderWorld
Flip
Wend
EndGraphics
End