bonjour,
est ce qu il y a une difference entre glViewport(0,0,(GLsizei) w,(GLsizei)h) et glViewport(0,0,w,h)???![]()
bonjour,
est ce qu il y a une difference entre glViewport(0,0,(GLsizei) w,(GLsizei)h) et glViewport(0,0,w,h)???![]()
A première vu non il s'agit d'un transtypage car glviewport doit attendre un GLsizei ( à vérifier dans la doc)
Non, mais si tu as besoin d'un tel transtypage, cela veut généralement dire que ton code est mal fait.Envoyé par swibina
Jc
Pas forcément. Chez moi par exemple GLsizei est un alias pour int ; que se passe-t-il si je veux exprimer mon viewport avec des coordonnées non signées ?Envoyé par fearyourself
De manière plus générale, lorsqu'on développe une couche par dessus OpenGL et que l'on ne peut pas exposer ses types particuliers, il faut toujours effectuer des transtypages car on n'a aucune garantie que nos types correspondront toujours avec ceux définis par OpenGL.
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
N'oublie pas le petit![]()
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Et bien justement, si c'était un non signé trop grand, cela passerait en négatif dans glViewPort ce qui me semble pas très bon...Envoyé par Laurent Gomila
Ahh non je ne suis pas d'accord.De manière plus générale, lorsqu'on développe une couche par dessus OpenGL et que l'on ne peut pas exposer ses types particuliers, il faut toujours effectuer des transtypages car on n'a aucune garantie que nos types correspondront toujours avec ceux définis par OpenGL.
Un transtypage ne fait d'autre que dire au compilateur "Ouai ouai je sais, mais t'inquiéte je sais que ca va passer".
C'est rare qu'un cast soit obligatoire si on a bien pensé le programme depuis le début. Pour ton problème de type OpenGL, si on faisait les choses proprement, on utiliserait directement les types OpenGL...
Jc
C'est vrai, autant directement déclarer w et h comme des GLsizei et dans ce cas le transtypage n'a pas lieu d'être.
Du coup pour exprimer un viewport avec des entiers non signé fait que tu ne respectes pas le prototype de glviewport non (puisque c'est un alias d'un int)?
Ou cela voudrait dire qu'une sur une plateforme X on a un GLsizei qui est un entier signé et sur une plateforme Y un GLsizei qui est un entier non signé![]()
Cela est tout à fait possible.Envoyé par hegros
C'est aussi le problème classique du type char par exemple qui est signé sur certaines architectures et non signés sur d'autres.
C'est pour cela qu'il vaut mieux utiliser le type d'OpenGL bien qu'on ne le fait jamais
Jc
Ah, un peu de débat
C'est juste mon transtypage qui est mauvais. Si on était vraiment parano (mais qui utilise un viewport de 2^16 ?) on mettrait un clamp plutôt qu'un transtypage direct.Et bien justement, si c'était un non signé trop grand, cela passerait en négatif dans glViewPort ce qui me semble pas très bon...
En plus il y a une certaine contradiction dans ce que tu dis : passer un nombre négatif n'est pas bon, mais tu continuerais pourtant à utiliser des entiers signés ?
Moi je prends le problème inversement : passer des négatifs n'est pas bon, donc je l'interdis ; à moi de mitouiller en interne pour que OpenGL ne râle pas avec mon entier non signé.
J'aimerais avoir ton avis sur la question suivante : pourquoi un programme bien pensé autoriserait des viewport négatifs ? Parce que l'API sous-jacente prend en paramètre un GLsizei ?Ahh non je ne suis pas d'accord.
Un transtypage ne fait d'autre que dire au compilateur "Ouai ouai je sais, mais t'inquiéte je sais que ca va passer".
C'est rare qu'un cast soit obligatoire si on a bien pensé le programme depuis le début. Pour ton problème de type OpenGL, si on faisait les choses proprement, on utiliserait directement les types OpenGL...
Et puis comme je te l'ai dit, utiliser les types OpenGL, c'est pas vraiment génial si on ne souhaite pas exposer l'API qu'on utilise. Si je fais un moteur 3D multi-API, j'utilise quoi pour mon viewport ? Des GLsizei, des DWORD ou des unsigned int ?![]()
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
En effet, c'est toujours bon, tant qu'on ne se perd pas.Envoyé par Laurent Gomila
En effet, ce serait une solution plus adapté.C'est juste mon transtypage qui est mauvais. Si on était vraiment parano (mais qui utilise un viewport de 2^16 ?) on mettrait un clamp plutôt qu'un transtypage direct.
Même si je sais que mon entier ne sera pas négatif dans une des zones de code, cela ne veut pas dire qu'il peut l'être dans une autre zone. Utiliser un entier signé pour un paramètre non signé n'est pas forcément dangereux ou une erreur si on sait ce qu'on fait et pourquoi on le fait.En plus il y a une certaine contradiction dans ce que tu dis : passer un nombre négatif n'est pas bon, mais tu continuerais pourtant à utiliser des entiers signés ?![]()
Oui mais il faut juste être sûr de ne pas sortir des bornes maximales des entiers. Sinon lorsque tu passeras de ton ragoût interne à OpenGL il risque d'avoir un problème.Moi je prends le problème inversement : passer des négatifs n'est pas bon, donc je l'interdis ; à moi de mitouiller en interne pour que OpenGL ne râle pas avec mon entier non signé.
Ah mais faut pas rester bloquer sur cet exemple, je parle d'un point de vue plus généralJ'aimerais avoir ton avis sur la question suivante : pourquoi un programme bien pensé autoriserait des viewport négatifs ?
Si vraiment tu voulais faire quelque chose de portable, rien t'interdis de faire tes propres types et à coup de typedef d'utiliser derrière les types d'OpenGL.Parce que l'API sous-jacente prend en paramètre un GLsizei ?
Et puis comme je te l'ai dit, utiliser les types OpenGL, c'est pas vraiment génial si on ne souhaite pas exposer l'API qu'on utilise. Si je fais un moteur 3D multi-API, j'utilise quoi pour mon viewport ? Des GLsizei, des DWORD ou des unsigned int ?![]()
Cela ne change pas le fait qu'un transtypage ne se justifie presque jamais.
Jc
ExactementEnvoyé par Laurent Gomila
![]()
Je n'ai pas la documentation de glviewport sous la main mais si cette fonction demande un GLsizei alors il faut se débrouiller pour lui passer un GLsizei ou équivalent.Envoyé par Laurent Gomila
Dans le cas d'un moteur 3D multi-API pour ne pas exposer l'api alors il faudrait que tu définisses un type comme cela je pense :
typedef GLsizei UnNom;
ainsi le type est masquépuisque j'imagine que selon la plateforme sur laquelle tu es GLsizei est un alias d'un int ou d'un unsigned int
Partager