Mauvaise couleur en OpenGL

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
SPH
Messages : 4946
Inscription : mer. 09/nov./2005 9:53

Mauvaise couleur en OpenGL

Message par SPH »

Salut,

Je voulais vous partager le code de base d'une fenêtre OpenGL.
Mais j'ai un problème de couleur.
Ligne 153 : la couleur demandé est (255,1,0,1). Le "1" final veux dire qu'on ne fait pas de transparence. Hors, là, (255,1,0) est considéré comme jaune (ça, c'est faux. C'est rouge LEGEREMENT moins foncé que du (255,0,0)).

Vous avez une idée de où ça viens ?

Grand merci... 😥

Code : Tout sélectionner

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Code : Erreur de couleur  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; PB6.0 (2022) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;EnableExplicit

;-CONSTANTS
Enumeration
  #MainWindow
  #OpenGLGadget
EndEnumeration

;These two GL constants are used for texture creation. Don't change their values.
#GL_BGR = $80E0
#GL_BGRA = $80E1

If ExamineDesktops()
  ddw=DesktopWidth(0)
  ddh=DesktopHeight(0)
Else
  ddw=1024
  ddh=768
EndIf


;********************* DPI *********************
dpix.f=DesktopResolutionX()
dpiy.f=DesktopResolutionY()

If dpix > 1
  xf.f=(1920/ddw)*dpix
Else
  xf = 1
EndIf

If dpiy > 1
  yf.f=(1024/ddh)*dpiy
Else
  yf = 1
EndIf

;**********************************************

;-STRUCTURES
Structure Integer2
  X.i
  Y.i
EndStructure
Global.Integer2 WindowDim
WindowDim\X = ddw
WindowDim\Y = ddh


;-DEFINES
Define.i Event
Define.i WindowFlags = #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget


;-DECLARES
Declare Render()
Declare Render2DQuad(OGLTexture.i, StartX.d, StartY.d, Width.i, Height.i, Z.d)
Declare SetupOpenGL()
Declare SetupGLTexture(ImageHandle.i)


;-MAIN WINDOW
win=OpenWindow(#MainWindow, 0, 0,ddw,ddh, "Picasso_SPH",#PB_Window_Maximize|#PB_Window_BorderLess)
If win=0
  Beep_(500,250) : Delay(150) : Beep_(500,250)
  MessageRequester("Erreur","OpenWindow() impossible")
  End
EndIf

screenGL=OpenGLGadget(#OpenGLGadget,0,0,ddw,ddh)
If screenGL=0
  Beep_(500,250) : Delay(150) : Beep_(500,250)
  MessageRequester("Erreur","OpenGLGadget() impossible")
  End
EndIf


SetupOpenGL()

AddKeyboardShortcut(0,  #PB_Shortcut_Escape, 666) ; quitter

glOrtho_(0,ddw,ddh,0,-1,1)
glMatrixMode_(#GL_MODELVIEW)
glLoadIdentity_()
glClear_(0)

;*********************************************************************************************************************************

;;;;;;;;;;;
timer=ElapsedMilliseconds()

glClearColor_(0,0,0, 1.0)
ShowCursor_(0)
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
;-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#################**********************************************
Repeat
  
  glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
  
  
  ;*****
  Repeat
    Event = WindowEvent()
    
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            Resx = GetGadgetAttribute(1, #PB_OpenGL_MouseX)
            Resy = GetGadgetAttribute(1, #PB_OpenGL_MouseY)
            ;;;;;;;         
            Select EventType()
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;             
            EndSelect
        EndSelect
      Case #PB_Event_Menu
        Select EventMenu()
          Case 666
            timer=ElapsedMilliseconds()-timer
            ;MessageRequester("Timer", Str(timer)+" ms - "+Str(scene)+" frames",2)
            ;           Debug scene
            ;           Debug timer
            ShowCursor_(1)
            End
        EndSelect
    EndSelect
    
  Until Event = 0
  
  
  ;##############################################
  ;##############################################
  ;##############################################
  ;##############################################
  
  
  glBegin_(#GL_POLYGON);
  
  glBlendFunc_(#GL_SRC_ALPHA,#GL_ONE_MINUS_SRC_ALPHA)
  
  glColor4f_(255,1,0,1)
  
  glVertex2f_(ddw/2-10,ddh/2-10);
  glVertex2f_(ddw/2+10,ddh/2-10);
  glVertex2f_(ddw/2+10,ddh/2+10);
  glVertex2f_(ddw/2-10,ddh/2+10);
  glEnd_()                      ; 
  
  ;##############################################
  ;##############################################
  ;##############################################
  ;##############################################
  
  
  
  SetGadgetAttribute(#OpenGLGadget, #PB_OpenGL_FlipBuffers, #True)
  
ForEver




Procedure Render()
  
  ;Clearing buffers and resetting clear color to remove old graphics from the last frame.
  glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
  ;  glClearColor_(0.2, 0.2, 0.2, 1.0)
  glClearColor_(0,0,0,1)
  
  ;## DRAWING TEXTURES/IMAGES
  ;First enable the Texture system.
  glEnable_(#GL_TEXTURE_2D)
  
  ;This procedure will create a quad and apply a texture to it.
  ;The Texture variable contains the texture created earlier using SetupGLTexture().
  Render2DQuad(Texture1, 0, 0, ImageWidth(Image1), ImageHeight(Image1), -2)
  ; Render2DQuad(Texture2, 0, 0, ImageWidth(Image2), ImageHeight(Image2), -1)
  
  ;After all the textures have been displayed disable the texture system.
  ;Otherwise it will conflict with the non texture graphics.
  glDisable_(#GL_TEXTURE_2D)
  
EndProcedure

Procedure Render2DQuad(OGLTexture.i, StartX.d, StartY.d, Width.i, Height.i, Z.d)
  
  ;The texture is first bound which tells OpenGL to use this texture for any future rendering.
  glBindTexture_(#GL_TEXTURE_2D, OGLTexture)
  glBegin_(#GL_QUADS)
  glColor4f_   (1,1,1,1)
  glNormal3f_  (0,0,1.0)
  glTexCoord2f_(1.0,1.0)
  glVertex3f_  (StartX+Width,StartY,Z)
  glTexCoord2f_(0.0,1.0)
  glVertex3f_  (StartX,StartY,Z)
  glTexCoord2f_(0.0,0.0)
  glVertex3f_  (StartX,StartY+Height,Z)
  glTexCoord2f_(1.0,0.0)
  glVertex3f_  (StartX+Width,StartY+Height,Z)
  glEnd_()
  
EndProcedure

Procedure SetupOpenGL()
  
  glMatrixMode_(#GL_PROJECTION)
  
  glOrtho_(0.0, WindowDim\X, WindowDim\Y, 0.0, -1000.0, 1000.0)
  
  glMatrixMode_(#GL_MODELVIEW)
  
  ; glEnable_(#GL_DEPTH_TEST)
  
  glEnable_(#GL_BLEND)
  glBlendFunc_(#GL_SRC_ALPHA, #GL_ONE_MINUS_SRC_ALPHA)
  
EndProcedure


[/code]

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
manababel
Messages : 144
Inscription : jeu. 14/mai/2020 7:40

Re: Mauvaise couleur en OpenGL

Message par manababel »

bonjour
la commande "glColor4f" =( r.f ,g.f, b.f,a.f)
les couleurs ne doivent pas etre comprise entre 0 et 1 ?
glColor4f_(1,0.1,0,1) donne du rouge.
Avatar de l’utilisateur
SPH
Messages : 4946
Inscription : mer. 09/nov./2005 9:53

Re: Mauvaise couleur en OpenGL

Message par SPH »

Ha, bien sûr. Je pense que tu as raison. Je vérifierais demain.

Thx 🙃

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Mauvaise couleur en OpenGL

Message par Ollivier »

Bonjour à vous,

je confirme la suggestion de manababel :

glUneFonction4f() signifie que 4 flottants sont utilisés dans les arguments de la fonction.

Je pense (à vérifier) qu'il y a saturation :

Code : Tout sélectionner

If n > 1.0
 n = 1.0
EndIf
If n < 0.0
 n = 0.0
EndIf
Ainsi, (255, 1, 0, 1) devient
(1.0, 1.0, 0.0, 1.0). Ainsi on a du rouge, du vert et de l'alpha opaque (si c'est RGBA) donc finalement un jaune opaque.

Une remarque :

vous pouvez, il me semble, vous faciliter la vie avec des tableaux, voire, plus facile encore, des structures.

@ sph

regarde les différentes fonctions se terminant par 3i, 4i, 3f, 4f, etc... : si tu rajoutes la lettre v, il n'y a qu'un seul argument à faire passer : l'adresse mémoire où se trouve la couleur, le sommet, etc...
Avatar de l’utilisateur
SPH
Messages : 4946
Inscription : mer. 09/nov./2005 9:53

Re: Mauvaise couleur en OpenGL

Message par SPH »

@ sph

regarde les différentes fonctions se terminant par 3i, 4i, 3f, 4f, etc... : si tu rajoutes la lettre v, il n'y a qu'un seul argument à faire passer : l'adresse mémoire où se trouve la couleur, le sommet, etc...
Houla, sans exemple, je ne saurais pas faire. Je dirais même plus : je vois à peine ce que ça veux dire 🤨

ps : votre correction de code (0 a 1.0) fonctionne ! Merciii

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Mauvaise couleur en OpenGL

Message par Ollivier »

Peut-être comme ça :

Code : Tout sélectionner

glColor4fv_(?jaune)

; ...

DataSection

jaune:
Data.f 1.0, 1.0, 0.0, 1.0

EndDataSection
Avatar de l’utilisateur
SPH
Messages : 4946
Inscription : mer. 09/nov./2005 9:53

Re: Mauvaise couleur en OpenGL

Message par SPH »

Cher Ollivier,

Pourquoi faire simple quand on veux faire compliqué ! :D

Une façon simple d'utiliser "glColor4f_()" comme une "RGB()", c'est de tout diviser par 255 :

Code : Tout sélectionner

r=200
v=100
b=17
alpha=127
;===
glColor4f_(r/255,v/255,b/255,alpha/255)

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Mauvaise couleur en OpenGL

Message par falsam »

Et ne pas oublier de déclarer r v b et alpha en float pour plus de précision.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Mauvaise couleur en OpenGL

Message par Ollivier »

@sph

Imagine un peintre sans palette : est-ce plus simple, avec ou sans ?

Si c'est plus simple avec une palette, un tableau (dans le sens informatique du terme !) fait office de palette.

Là, je t'ai mis :

Code : Tout sélectionner

glColor4fv_(?jaune)
... ceci pour voir le fonctionnement (j'espère que tu as testé avec succès). Mais tu peux aussi (et surtout) "pointer" un tableau.

Code : Tout sélectionner

Dim unePalette.f(15)

; ...

glColor4fv_(@unePalette(unCodeCouleurDeTonChoix) )
@falsam

je ne suis pas sûr que ça change beaucoup, dans son cas. La précision des calculs se décide en fonction du type de la donnée, qui va "supporter" le calcul. Donc, si c'est un float, chaque membre du calcul est converti en float (255 devient 255.0, etc...).
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Mauvaise couleur en OpenGL

Message par G-Rom »

Ollivier a écrit : mer. 20/juil./2022 20:15 @sph

Imagine un peintre sans palette : est-ce plus simple, avec ou sans ?

Si c'est plus simple avec une palette, un tableau (dans le sens informatique du terme !) fait office de palette.

Là, je t'ai mis :

Code : Tout sélectionner

glColor4fv_(?jaune)
... ceci pour voir le fonctionnement (j'espère que tu as testé avec succès). Mais tu peux aussi (et surtout) "pointer" un tableau.

Code : Tout sélectionner

Dim unePalette.f(15)

; ...

glColor4fv_(@unePalette(unCodeCouleurDeTonChoix) )
@falsam

je ne suis pas sûr que ça change beaucoup, dans son cas. La précision des calculs se décide en fonction du type de la donnée, qui va "supporter" le calcul. Donc, si c'est un float, chaque membre du calcul est converti en float (255 devient 255.0, etc...).
Il est foireux ton code mon lapin , tu pointes q'un seul float pour le coup :)

au lieu de datasection , une structure :

Code : Tout sélectionner

Structure color4f
  r.f
  g.f
  b.f
  a.f  
EndStructure


jaune.color4f
jaune\r = 1.0
jaune\v = 1.0
jaune\b = 0.0
jaune\a = 1.0

glColor4fv_(@jaune)
ou avec une palette comme le propose le père ollivier :

Code : Tout sélectionner

Structure color4f
  r.f
  g.f
  b.f
  a.f  
EndStructure


Dim palette.color4f(15)

...
...

glColor4fv_(@palette(unCodeCouleurDeTonChoix))
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Mauvaise couleur en OpenGL

Message par Ollivier »

G-Rom a écrit :Il est foireux ton code mon lapin , tu pointes q'un seul float pour le coup :)
Effectivement, ça s'est mal démoulé.
Répondre