GlEnable GL_LINE_SMOOTH

BlitzMax Forums/BlitzMax Beginners Area/GlEnable GL_LINE_SMOOTH

TartanTangerine (was Indiepath)(Posted 2004) [#1]
Is this implemented? I am using the Windows Beta.

This is some code

SetColor(255,255,255)
	SetLineWidth(1)
	GlEnable GL_LINE_SMOOTH
	DrawLine(1,1,200,20)
	
	GlEnable GL_LINE_SMOOTH
	glBegin GL_LINES
		glVertex2f 0,0
		glVertex2f 100,400
	glEnd


Niether line is antialiased.


teamonkey(Posted 2004) [#2]
You need to make sure you've got blending switched on, but sometimes graphics card drivers switch line anti-aliasing off anyway.

This is what they do in the OpenGL Red Book:
glEnable (GL_LINE_SMOOTH);
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glHint (GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
glLineWidth (1.5);

But I'd also change "GL_DONT_CARE" to "GL_NICEST".

Sometimes line anti-aliasing just doesn't work, and it's not particularly fast. I've seen a clever hack that uses a thin alpha-blended texture instead on a line, which is often faster, believe it or not.


TartanTangerine (was Indiepath)(Posted 2004) [#3]
Thanks TeaMonkey, Just found that myself in the Redbook.

I am already using textures and quads to do this but I thought I might see if this way was faster.


Diordna(Posted 2004) [#4]
So the code teamonkeky posted will run unmodified? Because I'd like to use it. I don't understand OpenGL (see other posts by me).


TartanTangerine (was Indiepath)(Posted 2004) [#5]
Diornda,

Here is the code I use to get The antialiased line. Great thing about MAX is that you can "mix-and-match"
Global Width:Int=800
Global Height:Int=600
Global Depth:Int=32



Graphics 800,600,32,0


HideMouse
While Not KeyHit( KEY_ESCAPE )
	glColor3f(1.0,1.0,1.0)
	glLineWidth 1
	GlEnable GL_LINE_SMOOTH
	GlEnable GL_BLEND
	glBlendFunc GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA
	glHint GL_LINE_SMOOTH_HINT, GL_NICEST
	DrawLine(0,0,200,500)

	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
	glColor3f(1.0,1.0,1.0)
	bglDrawText("FPS : "+Framecounter_framerate,800-(8*12),600-16-8)
	FlushMem
	Flip()
	Cls()


Wend
End



Diordna(Posted 2004) [#6]
In answer to my own question, yes, it does.

Function enableLineSmoothing(size:Double) 'size is the size of the line
glEnable (GL_LINE_SMOOTH);
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
glLineWidth (size);
End Function

What do you have against using SetColor? Is it just that you prefer using the 1.0 method instead of the 255? As far as I know, the 1.0 just gets converted into the 255, resulting in an extra, albeit tiny, step.

Thanks for your help. After I finish my current project, I'm going to make an all-vector game based on Gravitar.


teamonkey(Posted 2004) [#7]
What do you have against using SetColor? Is it just that you prefer using the 1.0 method instead of the 255? As far as I know, the 1.0 just gets converted into the 255, resulting in an extra, albeit tiny, step.

OpenGL can take both. SetColor's just a wrapper for glSetColor4ubv (unsigned byte vector). Your driver will convert the values to integers or floats, depending what the graphics card uses internally.