Author Topic: Convertir un tutoriel OpenGL C++ vers C  (Read 11275 times)

0 Members and 1 Guest are viewing this topic.

Offline moudubou

  • Base
    • View Profile
    • quelques photos d'explo
  • Ancienneté: 1990
  • Groupe: FLC
  • Rôle: code,orga
  • Ville: Lyon
Convertir un tutoriel OpenGL C++ vers C
« on: 28 April 2013 à 11:05:50 »
Hello
J'ai trouvé un tutoriel que j'ai enfin réussi à faire fonctionner, tout se passait plutôt bien
Sauf que là, je n'arrive pas à tout nettoyer du C++ vers le C

Code: [Select]
        // Get a handle for our "MVP" uniform
        GLuint MatrixID = glGetUniformLocation(programID, "MVP");

        // Projection matrix : 45° Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units
        glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
        // Camera matrix
        glm::mat4 View       = glm::lookAt(
                                                                glm::vec3(4,3,3), // Camera is at (4,3,3), in World Space
                                                                glm::vec3(0,0,0), // and looks at the origin
                                                                glm::vec3(0,1,0)  // Head is up (set to 0,-1,0 to look upside-down)
                                                   );
        // Model matrix : an identity matrix (model will be at the origin)
        glm::mat4 Model      = glm::mat4(1.0f);
        // Our ModelViewProjection : multiplication of our 3 matrices
        glm::mat4 MVP        = Projection * View * Model; // Remember, matrix multiplication is the other way around

Je me doute que ça commence comme ci-dessous, mais pour la suite, je suis bien embêté  ;D

D'ailleurs, si quelqu'un connait une URL plus pratique que le man d'OpenGL, je suis preneur aussi

Code: [Select]
// Get a handle for our "MVP" uniform
MatrixID=glGetUniformLocation(programID, "MVP");
// 45° fov, 4:3 ratio, display range
gluPerspective(45.0,4.0/3.0,0.1,100.0);
gluLookAt(4,3,3, // camera 4,3,3
        0,0,0    // look the origin 0,0,0
        0,1,0);  // head is up

MERCI  :)

ps: Non, je n'ai absolument pas envie de faire du C++

Offline MsK`

  • Base
    • Pouet.net
    • View Profile
  • Rôle: Code
  • Ville: Paris/RP
Re : Convertir un tutoriel OpenGL C++ vers C
« Reply #1 on: 28 April 2013 à 11:30:56 »
Ton problème c'est avec glm, pas opengl. glm est une lib de math C++ qui vise à répliquer en C++ tous les types et opérations disponibles en glsl. Il te suffit de remplacer ça par n'importe quelle autre lib de math C. XNA Math par exemple. (attention y'aura surement des conversions de matrices row major VS column major à faire)

Offline moudubou

  • Base
    • View Profile
    • quelques photos d'explo
  • Ancienneté: 1990
  • Groupe: FLC
  • Rôle: code,orga
  • Ville: Lyon
Re : Convertir un tutoriel OpenGL C++ vers C
« Reply #2 on: 28 April 2013 à 13:11:59 »
Ah ok!
Merci

En fait, ce que j'ai commencé, c'est pas bon, c'est du vieux openGL (gluPerspective, gluLookAt, etc.) et c'est à priori déprecié, tout comme les pushMatrix et popMatrix

En C99 j'ai trouvé linmath.h qui permet de jouer avec des vec4


Donc en fait, on a des librairies qui miment ce que permet de faire le GLSL, pour faire ces calculs au CPU et ensuite le filer à un shader...

Ça serait pas carrément plus simple de le faire directement dans un shader?
« Last Edit: 28 April 2013 à 13:29:48 by moudubou »

Offline ponce

Re : Convertir un tutoriel OpenGL C++ vers C
« Reply #3 on: 28 April 2013 à 14:51:04 »
Ca dépend du cas, par exemple inverser une matrice dans un shader c'est dommage si on pouvait le faire sur CPU et la passer par uniform / attribut.
Mais une multiplication matrice * vecteur ça va être souvent plus rapide de le faire dans les shaders vs prétraiter les vertex sur CPU.

Offline MsK`

  • Base
    • Pouet.net
    • View Profile
  • Rôle: Code
  • Ville: Paris/RP
Re : Convertir un tutoriel OpenGL C++ vers C
« Reply #4 on: 28 April 2013 à 17:21:36 »
Le côté mime du GLSL, c'est plus par facilité d'écriture que par souci de performance ou quoique ce soit d'autre. Y'a toujours des calculs à faire côté CPU dans une appli OpenGL. C'est juste plus sympa d'écrire :
Code: [Select]
glm::mat4 MVP        = Projection * View * Modelque :
Code: [Select]
XMMatrix MVP;
XMMatrixMultiply(Model, View, MVP);
XMMatrixMultiply(MVP, Projection, MVP);
(truc dans le genre)

edit: Je viens de jeter un oeil à linmath : ça n'utilise absolument pas les instructions vectorielles des CPU (SSE, neon, altivec & co). C'est un peu dommage quand on fait du calcul vectoriel...
« Last Edit: 28 April 2013 à 17:29:21 by MsK` »

Offline moudubou

  • Base
    • View Profile
    • quelques photos d'explo
  • Ancienneté: 1990
  • Groupe: FLC
  • Rôle: code,orga
  • Ville: Lyon
Re : Re : Convertir un tutoriel OpenGL C++ vers C
« Reply #5 on: 28 April 2013 à 18:39:54 »
edit: Je viens de jeter un oeil à linmath : ça n'utilise absolument pas les instructions vectorielles des CPU (SSE, neon, altivec & co). C'est un peu dommage quand on fait du calcul vectoriel...

Tout comme GLM dont je suis en train d'adapter quelques fonctions (Perspective et lookAt), c'est bourré de déclarations inutiles destinées à la lisibilité et l'optimisation est laissée au compilateur via toutes les déclarations en "inline"

J'ai bien vu quelques instructions SSE trainer, mais en commentaires.

De toutes façons, je ne suis clairement pas en phase d'optimisation, loin de là.


Bon, en tous cas, mon adaptation ne fonctionne pas encore, j'ai du boulot.  :D

Offline maracuja

  • Base
    • View Profile
Re : Convertir un tutoriel OpenGL C++ vers C
« Reply #6 on: 28 April 2013 à 19:17:45 »
Quel est l’intérêt de recoder une partie de code de c++ en c alors que celui peut très bien se mélanger via des directives adhoc pour faire en sorte que le name mangling se dégrade afin d'être compatible avec les appels en c convention ? A part bien entendu pour le fun ou par ego du DIY ?

Offline moudubou

  • Base
    • View Profile
    • quelques photos d'explo
  • Ancienneté: 1990
  • Groupe: FLC
  • Rôle: code,orga
  • Ville: Lyon
Re : Re : Convertir un tutoriel OpenGL C++ vers C
« Reply #7 on: 28 April 2013 à 19:27:36 »
Quote
ps: Non, je n'ai absolument pas envie de faire du C++

Quel est l’intérêt de recoder une partie de code de c++ en c alors que celui peut très bien se mélanger via des directives adhoc pour faire en sorte que le name mangling se dégrade afin d'être compatible avec les appels en c convention ? A part bien entendu pour le fun ou par ego du DIY ?

Je n'aime pas mélanger les torchons et les serviettes, je veux du code 100% C.  ;D

Offline maracuja

  • Base
    • View Profile
Re : Convertir un tutoriel OpenGL C++ vers C
« Reply #8 on: 28 April 2013 à 19:37:57 »
Ok, c’est ton choix. :)

Offline MsK`

  • Base
    • Pouet.net
    • View Profile
  • Rôle: Code
  • Ville: Paris/RP
Re : Convertir un tutoriel OpenGL C++ vers C
« Reply #9 on: 29 April 2013 à 08:52:46 »
C'est loin d'être la lib la plus optimisée, en même temps c'est pas vraiment le but, mais tout le code non SSE que tu vois est la uniquement pour l'émulation quand l'architecture ne les supporte pas. Sinon glm tourne bien majoritairement en SSE. Toutes les instructions SSE sont rangées dans les intrinsic_ pour faciliter le support des deux versions. Tout le reste du code utilise donc les fonctions SSE ou les fonctions émulées. Il est donc normal de ne pas voir du SSE partout.

Offline moudubou

  • Base
    • View Profile
    • quelques photos d'explo
  • Ancienneté: 1990
  • Groupe: FLC
  • Rôle: code,orga
  • Ville: Lyon
Re : Re : Convertir un tutoriel OpenGL C++ vers C
« Reply #10 on: 07 May 2013 à 12:20:51 »
Ok, c’est ton choix. :)

Un petit retour sur les tuto convertis en C :)

J'ai pas mal avancé depuis et à part ces opérations de matrices qui sont moins jolies à écrire, le code est complètement identique, vu que les appels à la librairie OpenGL se font avec des prototypes C. Au final je n'ai eu qu'à écrire deux fonctions (avec la linmath.h).

Je continue doucement mon chemin mais j'ai déjà des trucs qui tournent à l'écran, c'est motivant!

des fois que ça puisse servir à quelqu'un
Code: [Select]
/* adapted from glm-0.9.4.3 */
void OpenGLPerspective(mat4x4 Result,float fovy, float aspect, float zNear, float zFar)
{
#undef FUNC
#define FUNC "OpenGLPerspective"

float range,left,right,bottom,top;

range=tan(fovy*M_PI/360.0)*zNear;
left=-range*aspect;
right=range*aspect;
bottom=-range;
top=range;

mat4x4_frustum(Result,left,right,bottom,top,zNear,zFar);
}
/* adapted from glm-0.9.4.3 */
void OpenGLlookAt(mat4x4 Result, vec3 eye, vec3 center, vec3 up)
{
#undef FUNC
#define FUNC "OpenGLlookAt"

vec3 f,u,s;

vec3_sub(f,center,eye);
vec3_norm(f,f);
vec3_norm(u,up);
vec3_mul_cross(s,f,u);
vec3_norm(s,s);
vec3_mul_cross(u,s,f);

Result[0][0]=s[0];
Result[1][0]=s[1];
Result[2][0]=s[2];

Result[0][1]=u[0];
Result[1][1]=u[1];
Result[2][1]=u[2];

Result[0][2]=-f[0];
Result[1][2]=-f[1];
Result[2][2]=-f[2];

Result[3][0]=-vec3_mul_inner(s, eye);
Result[3][1]=-vec3_mul_inner(u, eye);
Result[3][2]= vec3_mul_inner(f, eye);

Result[0][3]=1.0;
Result[1][3]=1.0;
Result[2][3]=1.0;
Result[3][3]=1.0;
}

Offline MsK`

  • Base
    • Pouet.net
    • View Profile
  • Rôle: Code
  • Ville: Paris/RP
Re : Convertir un tutoriel OpenGL C++ vers C
« Reply #11 on: 07 May 2013 à 18:09:32 »
Code: [Select]
#undef FUNC
#define FUNC "OpenGLlookAt"
:o
quel est le fuck ?

Offline moudubou

  • Base
    • View Profile
    • quelques photos d'explo
  • Ancienneté: 1990
  • Groupe: FLC
  • Rôle: code,orga
  • Ville: Lyon
Re : Re : Convertir un tutoriel OpenGL C++ vers C
« Reply #12 on: 07 May 2013 à 20:58:33 »
Code: [Select]
#undef FUNC
#define FUNC "OpenGLlookAt"
:o
quel est le *** ?

Arf, c'est parce que je détourne toutes les allocations mémoire et que j'utilise un système de log perso.
Si j'ai des débordements, des libérations mémoires oubliées ou des messages d'info, ma librairie m'affiche le numéro de ligne, le source et la fonction qui pose problème  ;D