"Texture" for DrawPoly/DrawRect, etc
BlitzMax Forums/BlitzMax Beginners Area/"Texture" for DrawPoly/DrawRect, etc
| ||
Hello. Is there any way of using a background texture instead of a solid colour when using DrawPoly, or should I be going the OpenGL route? Ta. Goodbye. |
| ||
Hi SoggyP, I'm trying to do something very similar. The GL_TRIANGLE_STRIP and GL_TRIANGLE_FAN OGL commands look useful (thanks Dreamora) I've butchered the Nehe tutorial 6 to texture a 4 sided poly using GL_TRIANGLE_STRIP. I'm having trouble converting OGL type co-ords to 2D co-ords. This is what I have done so far... Replace the glBegin GL_QUADS section in the Nehe6() function with... glBegin GL_TRIANGLE_STRIP glTexCoord2d(1,1); glVertex3f(x+0.5,y+0.5,z) ' Top Right glTexCoord2d(0,1); glVertex3f(x-0.5,y+0.5,z) ' Top Left glTexCoord2d(1,0); glVertex3f(x+0.5,y-0.5,z) ' Bottom Right glTexCoord2d(0,0); glVertex3f(x-0.5,y-0.5,z) ' Bottom Left glEnd Not really sure what I'm doing yet but it's a start. <edit> If there's a nice simple way to texture a DrawPoly created shape it would be ideal. |
| ||
You can just use a GL_QUAD instead of a GL_TRIANGLE_STRIP to draw a rectangle. You are right in that you need to define the texture coordinates You also need to select which texture is being used with glBindTexture() You may also need to switch texturing on. |
| ||
Hi AngelDaniel, That was a simple example. In fact, I'll try with GL_POLYGON but the manuals I have don't say what the difference is (unless GL_POLYGON can only do convex shapes). |
| ||
I'm not too sure what polygon is without looking back at the docs. Triangles have 3 points, quads have 4. Triangle strips are strips of joined triangles with shared points, quad strips are strips of joined quads with shared points (which might be converted to triangles internally). There is also the triangle fan. Not sure on the polygon. |
| ||
Hello. Have you got a basic example of how to do this? Goodbye. |
| ||
Global ScreenWidth:Int=800 Global ScreenHeight:Int=600 Global ScreenDepth:Int=32 Global xrot:Float=0 Global yrot:Float=0 Global zrot:Float=0 Global Checkimage:Byte[256,256,4] Global Texname:Int bglCreateContext(ScreenWidth,ScreenHeight,ScreenDepth,0,BGL_BACKBUFFER | BGL_DEPTHBUFFER) '| BGL_FULLSCREEN InitGl() While Not KeyHit( KEY_ESCAPE ) nehe6() glColor3f(1.0,1.0,1.0) 'Framecounter-------------------------------------------- Framecounter_counter=Framecounter_counter+1 If Framecounter_time=0 Then Framecounter_time=MilliSecs() If Framecounter_time+1001 <MilliSecs() Then Framecounter_framerate=Framecounter_counter Framecounter_counter=0 Framecounter_time=MilliSecs() EndIf bglDrawText("FPS : "+Framecounter_framerate,ScreenWidth-(8*12),ScreenHeight-16-8) '-------------------------------------------------------- bglDrawText("Nehe lesson 6",10,24) FlushMem bglSwapBuffers Wend End Function InitGl() LoadGlTextures() glClearColor(0.0, 0.0, 0.0, 0.0) glClearDepth 1.0 glDepthFunc(GL_LESS) glEnable(GL_DEPTH_TEST) glShadeModel(GL_SMOOTH) glViewport(0,0,ScreenWidth,ScreenHeight) glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(45.0,Float(ScreenWidth)/Float(ScreenHeight),1.0,100.0) glMatrixMode(GL_MODELVIEW) End Function Function LoadGlTextures() Local PointeurImg:Byte Ptr Local TexWidth Local TexHeight tex01:TPixmap=LoadPixmap("data/logo.bmp") TexWidth=tex01.Width TexHeight=tex01.Height PointeurImg=PixmapPixelPtr(tex01,0,0) pp=0 For y=TexHeight-1 To 0 Step -1 For x=0 To TexWidth-1 Checkimage[y,x,0]=PointeurImg[pp] Checkimage[y,x,1]=PointeurImg[pp+1] Checkimage[y,x,2]=PointeurImg[pp+2] Checkimage[y,x,3]=100 pp=pp+3 Next Next tex01=Null glPixelStorei(GL_UNPACK_ALIGNMENT,1) glGenTextures(1, Varptr Texname) glBindTexture(GL_TEXTURE_2D, Texname) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TexWidth, TexHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, Checkimage) End Function Function nehe6() glClear GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT glEnable(GL_TEXTURE_2D) glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE) glBindTexture GL_TEXTURE_2D,Texname glLoadIdentity glTranslatef 0.0,0.0,-5.0 glRotatef xrot,1.0,0.0,0.0 ' Rotate On The X Axis glRotatef yrot,0.0,1.0,0.0 ' Rotate On The Y Axis glRotatef zrot,0.0,0.0,1.0 ' Rotate On The Z Axis glBegin(GL_TRIANGLE_STRIP) ' Build Quad From A Triangle Strip glTexCoord2d(1,1); glVertex3f(x+0.5,y+0.5,z) ' Top Right glTexCoord2d(0,1); glVertex3f(x-0.5,y+0.5,z) ' Top Left glTexCoord2d(1,0); glVertex3f(x+0.5,y-0.5,z) ' Bottom Right glTexCoord2d(0,0); glVertex3f(x-0.5,y-0.5,z) ' Bottom Left glEnd() ' Done Building Triangle Strip xrot = xrot + 0.003 ' X Axis Rotation yrot = yrot + 0.002 ' Y Axis Rotation zrot = zrot + 0.004 ' Z Axis Rotation glDisable(GL_TEXTURE_2D) End Function This is the butchered test I did from Nehe tutorials. The .bmp has to be 256*256. |
| ||
Hello. @Tonyg: Thanks very much for that. Quick question (before I start asking long-winded, complex ones, should the glXXX commands become highlighted in the Standard IDE? Goodbye. |
| ||
Nope, only the bgl ones. My next step is to check gluOrtho2d to use 2D co-ordinates and then create a real 'poly' to use with either GL_POLYGON in that example or a better GL_TRIANGLE_STRIP. Once (if) it's working then check whether it works with bmx graphics mode rather than GL context. Seems a shame we can't just say my+poly=drawpoly(array)and then 'texture mypoly,myimage' but that's the result I'm going for. |
| ||
I've got a horrible feeling I'm going about this the wrong way. The brl.glmax2d module shows that Drawpoly uses GL_POLYGON. I'm assuming that OGL can texture poly created using GL_POLYGON so, in theory, shouldn't it be able to texture a poly created using Drawpoly? BMAX has a bglCreateFromPixmap command and, within glmax2d, there are functions such as bindtex/enabletex and createtex function. Now, the bit where I'm banging my head against the wall. I've read THIS which suggests I can't use BindTex. However, I can assign a texture taken from a pixmap to an image. How would I do the same assign but to a Drawpoly? |
| ||
I managed it in very few lines :) (but it's no good for realtime unless you simply want the texture to remain the same) |
| ||
Hi Perturbatio, Thanks for the response. This is what I'm after (soggyp, sorry if it answers your query... I'll open another post if needed). SetGraphicsDriver GLMax2DDriver() Graphics 640,480,0 img1:TImage = LoadImage("beach1.png") '64*64 img2:TPixmap = LoadPixmap("bmax160.png") '160*160 texture_name:Int = bglTexFromPixmap(img2) Cls DrawImage img1,100,100 DrawPixmap img2,100,300 glBindTexture GL_TEXTURE_2D, texture_name DrawImage img1,300,100 Flip WaitKey The texture is resized to fit the new image. |
| ||
Hello. At the moment I'm not sure, I'll have to check, though I think I was initially after what the Pert one has posted though if there's a way of stretching to fit, etc, that might be better. I'll try when I get home later. Ta. Goodbye. |