QB64.org Forum

Active Forums => Programs => Topic started by: TempodiBasic on April 12, 2021, 05:19:19 pm

Title: Triangle multicolored in OpenGl (Rosetta code)
Post by: TempodiBasic on April 12, 2021, 05:19:19 pm
Hi QB64coders
another task for Rosetta Code in QB64

Code: QB64: [Select]
  1. 'Task
  2. 'Display a smooth shaded triangle with OpenGL.
  3. Screen _NewImage(600, 600, 32)
  4. glInput = 0
  5.  
  6.  
  7. Sub _GL ()
  8.     If glInit = 0 Then
  9.         _glViewport 1, 1, 600, 600
  10.         _glClearColor 0, 0, 0, 1
  11.         glInit = -1
  12.     End If
  13.     _glClear _GL_COLOR_BUFFER_BIT
  14.     _glBegin _GL_TRIANGLES
  15.     _glColor4f 1, 0, 0, 1
  16.     _glVertex2f -1, -1
  17.     _glColor4f 0, 1, 0, 1
  18.     _glVertex2f 0, 0
  19.     _glColor4f 0, 0, 1, 1
  20.     _glVertex2f 1, -1
  21.     _glEnd
Title: Re: Triangle multicolored in OpenGl (Rosetta code)
Post by: AndyA on April 12, 2021, 05:47:09 pm
The Rosetta Code task name is 'OpenGL'.   ( https://rosettacode.org/wiki/OpenGL)

Had a hard time finding what it is we're supposed to be looking for. Did you already submit the code to Rosetta Code?  I didn't see a 'QB64' entry.

I dunno, maybe a SLEEP: SYSTEM at the end instead DO:WHILE loop, to keep CPU usage to a minimum.

By the way, nice, concise, clean code for the triangle.

Title: Re: Triangle multicolored in OpenGl (Rosetta code)
Post by: TempodiBasic on April 12, 2021, 07:26:29 pm
Hi AndyA
thanks to evaluate my task.

Yes maybe better to post the link of the task! I'll do next time.

Quote
Did you already submit the code to Rosetta Code?  I didn't see a 'QB64' entry
I've posted before here to show the task to QB64 friends. I'll post soon if there is no better code to show.
Title: Re: Triangle multicolored in OpenGl (Rosetta code)
Post by: AndyA on April 12, 2021, 09:43:00 pm
TempodiBasic,

Just a silly question, as I know nothing about OpenGL, is there a way to make the triangle cover the whole 600x600 screen?
Title: Re: Triangle multicolored in OpenGl (Rosetta code)
Post by: TempodiBasic on April 13, 2021, 06:02:21 pm
@AndyA
the OpenGl graphic system has its own cohordinates and its primitive graphic functions....
the range of Y cohordinates is -1(bottom) +1 top --> the Y increases from bottom to top while in the standard graphic it goes from top to bottom
the range of x cohordinates is -1 (left) +1(right)
the center of the screen is 0,0
as you can see here.
https://raw.githubusercontent.com/AshishKingdom/OpenGL-Tutorials/gh-pages/images/first-triangle/coordinate_system.png (https://raw.githubusercontent.com/AshishKingdom/OpenGL-Tutorials/gh-pages/images/first-triangle/coordinate_system.png)
A first good tutorial is that of Ashish at this web address https://ashishkingdom.github.io/OpenGL-Tutorials/ (https://ashishkingdom.github.io/OpenGL-Tutorials/)

A short answer is  change the 2nd vertex2f from 0,0 to 0,1   (vertex2f x,y)
Title: Re: Triangle multicolored in OpenGl (Rosetta code)
Post by: AndyA on April 13, 2021, 07:25:59 pm
Yep, that's what I was trying to figure out. It's just like the X/Y axis I learned in school vs. the computer screen coordinates.

Thanks for the solution and the link to Ashish's OpenGL tutorial page.
Title: Re: Triangle multicolored in OpenGl (Rosetta code)
Post by: bplus on April 14, 2021, 01:51:11 pm
It would be nice to work with any 3 given points (that fit on screen) and any 3 colors for a Rosetta post.
Title: Re: Triangle multicolored in OpenGl (Rosetta code)
Post by: TempodiBasic on April 15, 2021, 06:11:57 pm
@bplus
IMHO you can have two way to got this....

the first is simpler
make at random the 3 vertex cohordinates in the range of -1 to +1 for the X and Y
 make at random the RGBA components of color in the range of 0 to +1 (0-255)
and you got it
as here
Code: QB64: [Select]
  1. 'Task
  2. 'Display a smooth shaded triangle with OpenGL changing vertex's values
  3. ' and color's values.
  4. Screen _NewImage(600, 600, 32)
  5. Dim Shared glInit As Integer, GlNew As Integer
  6. glInput = 0
  7.     If GlNew > 100 Then GlNew = 0 Else GlNew = GlNew + 1
  8.  
  9.  
  10. Sub _GL ()
  11.     Static r1, r2, r3, g1, g2, g3, b1, b2, b3, x1, x2, x3, y1, y2, y3
  12.     If glInit = 0 Then
  13.         _glViewport 1, 1, 600, 600
  14.         _glClearColor 0, 0, 0, 1
  15.         glInit = -1
  16.     End If
  17.     _glClear _GL_COLOR_BUFFER_BIT
  18.  
  19.     If GlNew = 1 Then
  20.         r1 = Rnd * 1.0
  21.         r2 = Rnd * 1.0
  22.         r3 = Rnd * 1.0
  23.         g1 = Rnd * 1.0
  24.         g2 = Rnd * 1.0
  25.         g3 = Rnd * 1.0
  26.         b1 = Rnd * 1.0
  27.         b2 = Rnd * 1.0
  28.         b3 = Rnd * 1.0
  29.  
  30.         x1 = (Rnd * 2.0) - 1
  31.         y1 = (Rnd * 2.0) - 1
  32.         x2 = (Rnd * 2.0) - 1
  33.         y2 = (Rnd * 2.0) - 1
  34.         x3 = (Rnd * 2.0) - 1
  35.         y3 = (Rnd * 2.0) - 1
  36.     End If
  37.  
  38.     _glBegin _GL_TRIANGLES
  39.     _glColor4f r1, g1, b1, 1
  40.     _glVertex2f x1, y1
  41.     _glColor4f r2, g2, b2, 1
  42.     _glVertex2f x2, y2
  43.     _glColor4f r3, g3, b3, 1
  44.     _glVertex2f x3, y3
  45.     _glEnd

the second way is to port the GL part of code from this demo in which I use a very fine your program to show the other two graphic output : normal or starndard graphic an the OpenGl graphic while in your original work you have greatly mastered the Maptriangles mode. https://www.qb64.org/forum/index.php?topic=3334.msg126287#msg126287 (https://www.qb64.org/forum/index.php?topic=3334.msg126287#msg126287)


Title: Re: Triangle multicolored in OpenGl (Rosetta code)
Post by: bplus on April 15, 2021, 07:16:14 pm
@TempodiBasic Good changes! Could the switching to a new triangle be smoothed out maybe with _delay or _limit?
Title: Re: Triangle multicolored in OpenGl (Rosetta code)
Post by: TempodiBasic on April 16, 2021, 03:59:57 am
@bplus
you're right! Using _delay can do a smoother changing of the aspect of the triangle!
here a way to get this:
Code: QB64: [Select]
  1. 'Task
  2. 'Display a smooth shaded triangle with OpenGL changing vertex's values
  3. ' and color's values.
  4. Screen _NewImage(600, 600, 32)
  5. Dim Shared glInit As Integer, GlNew As Integer
  6. glInput = 0
  7.     If GlNew = 100 Then GlNew = 0 Else GlNew = GlNew + 1
  8.     _Delay .002
  9.  
  10.  
  11. Sub _GL ()
  12.     Static r1, r2, r3, g1, g2, g3, b1, b2, b3, x1, x2, x3, y1, y2, y3
  13.     If glInit = 0 Then
  14.         _glViewport 1, 1, 600, 600
  15.         _glClearColor 0, 0, 0, 1
  16.         glInit = -1
  17.     End If
  18.     _glClear _GL_COLOR_BUFFER_BIT
  19.  
  20.     If GlNew = 1 Then
  21.         r1 = Rnd * 1.0
  22.         r2 = Rnd * 1.0
  23.         r3 = Rnd * 1.0
  24.         g1 = Rnd * 1.0
  25.         g2 = Rnd * 1.0
  26.         g3 = Rnd * 1.0
  27.         b1 = Rnd * 1.0
  28.         b2 = Rnd * 1.0
  29.         b3 = Rnd * 1.0
  30.  
  31.         x1 = (Rnd * 2.0) - 1
  32.         y1 = (Rnd * 2.0) - 1
  33.         x2 = (Rnd * 2.0) - 1
  34.         y2 = (Rnd * 2.0) - 1
  35.         x3 = (Rnd * 2.0) - 1
  36.         y3 = (Rnd * 2.0) - 1
  37.     End If
  38.  
  39.     _glBegin _GL_TRIANGLES
  40.     _glColor4f r1, g1, b1, 1
  41.     _glVertex2f x1, y1
  42.     _glColor4f r2, g2, b2, 1
  43.     _glVertex2f x2, y2
  44.     _glColor4f r3, g3, b3, 1
  45.     _glVertex2f x3, y3
  46.     _glEnd
Title: Re: Triangle multicolored in OpenGl (Rosetta code)
Post by: bplus on April 16, 2021, 01:24:47 pm
Hmm... that GL stuff seems to be working under it's own clock???
Title: Re: Triangle multicolored in OpenGl (Rosetta code)
Post by: TempodiBasic on April 17, 2021, 05:40:07 pm
@bplus
in QB64 Opengl is a parallel process to the ordinary code. However the GPU is another chip parallel to the CPU.