Autore Topic: [C][OPENGL] lightning e colore  (Letto 2000 volte)

Offline raistlin77it

  • Tech Guru
  • *****
  • Post: 221
  • Karma: +2/-0
    • Mostra profilo
[C][OPENGL] lightning e colore
« il: 10 Ottobre 2011, 19:08:24 »
ho un piccolissimo problema da esporvi.

nella mia scena disegno un cubo colorato tramite glColor3ub , il cubo è di una unità ed ha le normali già calcolate fisse

nella scena ho anche 2 luci.

quando con glScalef scalo  a metà il mio cubo, magicamente perdo il colore.
se scalo e spengo le luci invece il cubo mantiene il colore.

why ?
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: [C][OPENGL] lightning e colore
« Risposta #1 il: 10 Ottobre 2011, 22:06:44 »
probabilmente sono saltate le normali... posta il codice...
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline raistlin77it

  • Tech Guru
  • *****
  • Post: 221
  • Karma: +2/-0
    • Mostra profilo
Re: [C][OPENGL] lightning e colore
« Risposta #2 il: 10 Ottobre 2011, 22:24:45 »
Citazione da: "TheKaneB"
probabilmente sono saltate le normali... posta il codice...

Si molto probabilmente sono le normali, ma perchè saltano?

Codice: [Seleziona]
if (Tutorial_Cube[i][0][0].solid!=64 /*|| Tutorial_Cube[i][0][0].Dig_Anim==1*/) {
                       glColor3ub(Tutorial_Cube[i][0][0].rcol,Tutorial_Cube[i][0][0].gcol,Tutorial_Cube[i][0][0].bcol);
                       glPushMatrix();
                       glTranslatef((float)i,0,0);
                       if (Tutorial_Cube[i][0][0].Dig_Anim==1) {
                           glPushMatrix();
                           glColor3ub(Tutorial_Cube[i][0][0].rcol,Tutorial_Cube[i][0][0].gcol,Tutorial_Cube[i][0][0].bcol);
                           glScalef(sin(DegToRad(Tutorial_Cube[i][0][0].Frame+90)),sin(DegToRad(Tutorial_Cube[i][0][0].Frame+90)),sin(DegToRad(Tutorial_Cube[i][0][0].Frame+90)));
                           DrawGameCube(Tutorial_Cube[i][0][0];

le normali sono hardcoded nel drawgamecube, perciò dici di ricalcolarle sempre ogni volta che scalo?
è una smarronata :) visto che faccio sparire i cubi scalandoli a 0
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: [C][OPENGL] lightning e colore
« Risposta #3 il: 10 Ottobre 2011, 22:31:30 »
posta anche l'altra funzione che chiami... DrawGameCube
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline raistlin77it

  • Tech Guru
  • *****
  • Post: 221
  • Karma: +2/-0
    • Mostra profilo
Re: [C][OPENGL] lightning e colore
« Risposta #4 il: 10 Ottobre 2011, 22:34:51 »
Citazione da: "TheKaneB"
posta anche l'altra funzione che chiami... DrawGameCube


E' tutta così un quad alla volta

Codice: [Seleziona]
//************************ LEFT  FACE *************************
        glBegin(GL_QUADS);
            glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( -0.5f,  -0.5f,   +0.5f);
            glNormal3f(-1.000000,0.000000,0.000000);//lNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( -0.5f,  +0.5f,   +0.5f);
            glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( -0.5f,  +0.5f,   -0.5f);
            glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( -0.5f,  -0.5f,   -0.5f);
        glEnd();

Le normali sono hardcoded, perchè il cubo ha sempre le stesse coordinate, lo traslo lo ruoto e lo scalo poi a piacere

questo è quello che ottengo
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: [C][OPENGL] lightning e colore
« Risposta #5 il: 11 Ottobre 2011, 00:13:06 »
Boh è proprio strano... su che OS lo stai provando?
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline raistlin77it

  • Tech Guru
  • *****
  • Post: 221
  • Karma: +2/-0
    • Mostra profilo
Re: [C][OPENGL] lightning e colore
« Risposta #6 il: 11 Ottobre 2011, 00:14:04 »
su windows (sdl+gl)

Ah mi ero scordato, naturalmente è attivato il GL_COLOR_MATERIAL

mah , sa il cavolo perchè non va....
per ora risolvo spegnendo le luci, e riaccendendole dopo che ho disegnato il cubo rimpicciolito

da altre prove anche se ingrandisco il cubo, mi cambia colore, questa volta al posto di virare al bianco scurisce il cubo , bho...
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: [C][OPENGL] lightning e colore
« Risposta #7 il: 11 Ottobre 2011, 11:01:11 »
Appena ho tempo faccio qualche prova. Sono un po' fuori allenamento per le OpenGL
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline raistlin77it

  • Tech Guru
  • *****
  • Post: 221
  • Karma: +2/-0
    • Mostra profilo
Re: [C][OPENGL] lightning e colore
« Risposta #8 il: 11 Ottobre 2011, 11:53:56 »
Citazione da: "TheKaneB"
Appena ho tempo faccio qualche prova. Sono un po' fuori allenamento per le OpenGL

Ho qui giusto pronto un listato :D :D :D :D




Codice: [Seleziona]
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <GL/gl.h>
#include "SDL/SDL.h"
#include "SDL/SDL_opengl.h"




typedef int bool;

#ifndef TRUE
#define TRUE    1
#endif
#ifndef FALSE
#define FALSE   0
#endif
#ifndef true
#define true    1
#endif
#ifndef false
#define false   0
#endif


#define DegToRad(a)   ( (a) *  0.01745329252f )
#define RadToDeg(a)   ( (a) * 57.29577951f )


typedef  struct Game_cube {  // cube struct for the game
    int xtex,ytex,ztex;
    int solid;
    int guaranteed;
    int rcol,gcol,bcol;
    int hiding;
    int Frame;
    int Paint_Anim;
    int Dig_Anim;
}Game_cube;

typedef  struct GRRLIB_texImg
{
    /*unsigned*/ int    w;              /**< Texture width.    */
    /*unsigned*/ int    h;              /**< Texture height.   */
    int             handlex;        /**< Texture handle x. */
    int             handley;        /**< Texture handle y. */
    int             offsetx;        /**< Texture offset x. */
    int             offsety;        /**< Texture offset y. */
    bool           tiledtex;        /**< Texture is tiled if set to true.   */
    unsigned int   tilew;           /**< Width of one tile.                 */
    unsigned int   tileh;           /**< Height of one tile.                */
    unsigned int   nbtilew;         /**< Number of tiles for the x axis.    */
    unsigned int   nbtileh;         /**< Number of tiles for the y axis.    */
    unsigned int   tilestart;       /**< Offset to tile starting position.  */
    float          ofnormaltexx;    /**< Offset of normalized texture on x. */
    float          ofnormaltexy;    /**< Offset of normalized texture on y. */
    int            tex_id;          /**< Texture ID.       */

}GRRLIB_texImg;

GRRLIB_texImg *numbers;

Game_cube Tutorial_Cube[5][1][1];


int FRAMES_PER_SECOND = 10;
int frame = 0;
int startTicks = 0;
int currentTicks=0;
int elapsedTime =0;



int SCREENW=800;
int SCREENH=600;


SDL_Event event;

float LightPos[4]={0.0f,5.0f,20.0f,0.0f};
float grayDiffuseLight[] = {0.5, 0.5, 0.5}; //{0.5, 0.5, 0.5};
float whiteDiffuseLight[] = {1.0,1.0,1.0};


void glEnable2D()
{
   glMatrixMode(GL_PROJECTION);
   glPushMatrix();
   glLoadIdentity();

   glOrtho( 0, 800, 600, 0, -1, 1 );
   glMatrixMode(GL_MODELVIEW);
   glPushMatrix();
   glLoadIdentity();
   glTranslatef(0.375, 0.375, 0.);

   glPushAttrib(GL_DEPTH_BUFFER_BIT);
   glDisable(GL_DEPTH_TEST);
   glDisable(GL_LIGHTING);
}

void glDisable2D()
{
   glPopAttrib();
   glMatrixMode(GL_PROJECTION);
   glPopMatrix();
   glMatrixMode(GL_MODELVIEW);
   glPopMatrix();
   glEnable(GL_LIGHTING);
   glEnable(GL_DEPTH_TEST);
}

void DrawGameCube(Game_cube gc);
void DrawWireCube();

int main(int argc, char *argv[]) {

    int done;
    int frame=0;


    SDL_Surface *screen;



    int i,k;

    int xrot;
    int yrot;
    int button;
    int cubenumber=0;


    SDL_Init(SDL_INIT_VIDEO );

    SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );

    screen = SDL_SetVideoMode( SCREENW, SCREENH, 32, SDL_OPENGL /*| SDL_FULLSCREEN*/);


    glViewport( 0, 0, SCREENW, SCREENH );
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0, 1.0 * SCREENW/SCREENH, 0.1, 400.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0,0,18,0.0,0.0,0.0,0.0,1.0,0.0);

    glEnable (GL_DEPTH_TEST);

    glEnable (GL_COLOR_MATERIAL);

/*************************************************************/
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHT1);
    glLightfv(GL_LIGHT0,GL_POSITION,LightPos);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteDiffuseLight);
    glLightfv(GL_LIGHT1,GL_POSITION,LightPos);
    glLightfv(GL_LIGHT1, GL_DIFFUSE, grayDiffuseLight);

    glEnable( GL_LINE_SMOOTH );
    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
    glLineWidth(2);

/*************************************************************/


    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glClearColor( 1, 1, 1, 1);



    done=0;

    xrot=30;
    yrot=80;



  for (i=0;i<5;i++) {
        Tutorial_Cube[i][0][0].xtex=255;
        Tutorial_Cube[i][0][0].ytex=255;
        Tutorial_Cube[i][0][0].ztex=255;
        Tutorial_Cube[i][0][0].solid=1;
        Tutorial_Cube[i][0][0].rcol=156;
        Tutorial_Cube[i][0][0].gcol=101;
        Tutorial_Cube[i][0][0].bcol=231;
        Tutorial_Cube[i][0][0].Frame=0;
    }




  while(!done) {

    startTicks=SDL_GetTicks();
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


        if(SDL_PollEvent(&event)) {
            if (event.type==SDL_KEYDOWN & event.key.keysym.sym == SDLK_ESCAPE) done=1;

            if (event.type==SDL_MOUSEBUTTONDOWN) button=1;
            if (event.type==SDL_MOUSEBUTTONUP) button=0;

        }

        if (button>0) {
            button=0;
            Tutorial_Cube[cubenumber][0][0].solid = 65;
            Tutorial_Cube[cubenumber][0][0].Frame=0;
            Tutorial_Cube[cubenumber][0][0].Dig_Anim=1;
            cubenumber++;


        }

            glPushMatrix();
            glRotatef(xrot,1,0,0);
            glRotatef(yrot,0,1,0);
            glEnable(GL_POLYGON_OFFSET_FILL);
            glPolygonOffset(.5, .5);
            glPushMatrix();
            glScalef(1.5,1.5,1.5);
            glTranslatef(-2.0f,0.0f,0.0f);
            for(i=0;i<5;i++) {
                   if (Tutorial_Cube[i][0][0].solid!=64 ) {
                       glColor3ub(Tutorial_Cube[i][0][0].rcol,Tutorial_Cube[i][0][0].gcol,Tutorial_Cube[i][0][0].bcol);
                       glPushMatrix();
                       glTranslatef(1.0*i,0,0);
                       if (Tutorial_Cube[i][0][0].Dig_Anim==1) {
                           glPushMatrix();
                           glScalef(sin(DegToRad(Tutorial_Cube[i][0][0].Frame+90)),sin(DegToRad(Tutorial_Cube[i][0][0].Frame+90)),sin(DegToRad(Tutorial_Cube[i][0][0].Frame+90)));
                           DrawGameCube(Tutorial_Cube[i][0][0]);
                           glColor3ub(0,0,0);
                           DrawWireCube();
                           Tutorial_Cube[i][0][0].Frame+=6;
                           if (Tutorial_Cube[i][0][0].Frame==90) {Tutorial_Cube[i][0][0].solid=64;Tutorial_Cube[i][0][0].Dig_Anim=0;Tutorial_Cube[i][0][0].Frame=0;}
                           glPopMatrix();
                       } else {
                            DrawGameCube(Tutorial_Cube[i][0][0]);
                            glColor3ub(0,0,0);
                            DrawWireCube();
                       }
                       glPopMatrix();
                   }
            }
            glPopMatrix();
            glPopMatrix();





























        elapsedTime = (SDL_GetTicks() - startTicks);
        if( elapsedTime < 1000 / FRAMES_PER_SECOND  ) SDL_Delay( ( 1000 / FRAMES_PER_SECOND ) - elapsedTime );
        frame++;

        SDL_GL_SwapBuffers();

    }

    SDL_Quit();

return 0;
}




void DrawGameCube(Game_cube gc) {               // draw the game cube calc the normals etc.

    float       s1, s2, t1, t2;

    // The 0.001f/x is the frame correction formula by spiffen

 if (gc.ztex<255) {
        glEnable( GL_TEXTURE_2D );
        //******************** TILE CALC  *************************
        glBindTexture(GL_TEXTURE_2D, numbers->tex_id);
        s1 = (gc.ztex % numbers->nbtilew) * numbers->ofnormaltexx;
        s2 = s1 + numbers->ofnormaltexx;
        t1 = ((int)(gc.ztex/numbers->nbtilew)) * numbers->ofnormaltexy;
        t2 = t1 + numbers->ofnormaltexy;
        //******************** FRONT FACE *************************
        glBegin(GL_QUADS);
            glNormal3f(0.000000,0.000000,1.000000);
            glTexCoord2f(s1, t2);
            //glTexCoord2f (0.0f, 1.0f);
            glVertex3f( -0.5f,  -0.5f,   +0.5f);
            glNormal3f(0.000000,0.000000,1.000000);
           // glTexCoord2f (1.0f, 1.0f);
            glTexCoord2f(s2, t2);
            glVertex3f( +0.5f,  -0.5f,   +0.5f);
            glNormal3f(0.000000,0.000000,1.000000);
            //glTexCoord2f (1.0f, 0.0f);
            glTexCoord2f(s2, t1);
            glVertex3f( +0.5f,  +0.5f,   +0.5f);
            glNormal3f(0.000000,0.000000,1.000000);
            //glTexCoord2f (0.0f, 0.0f);
            glTexCoord2f(s1, t1);
            glVertex3f( -0.5f,  +0.5f,   +0.5f);
        glEnd();
        //*********************** BACK  FACE ****************************
        glBegin(GL_QUADS);
            glNormal3f(0.000000,0.000000,-1.000000);
//            glTexCoord2f (1.0f, 1.0f);
            glTexCoord2f(s2, t2);
            glVertex3f( -0.5f,  -0.5f,  -0.5f);
            glNormal3f(0.000000,0.000000,-1.000000);
//            glTexCoord2f (1.0f, 0.0f);
            glTexCoord2f(s2, t1);
            glVertex3f( -0.5f,  +0.5f,  -0.5f);
            glNormal3f(0.000000,0.000000,-1.000000);
//            glTexCoord2f (0.0f, 0.0f);
            glTexCoord2f(s1, t1);
            glVertex3f( +0.5f,  +0.5f,  -0.5f);
            glNormal3f(0.000000,0.000000,-1.000000);
//            glTexCoord2f (0.0f, 1.0f);
            glTexCoord2f(s1, t2);
            glVertex3f( +0.5f,  -0.5f,  -0.5f);
        glEnd();
        glDisable( GL_TEXTURE_2D );
 } else {
        //******************** FRONT FACE *************************

        glBegin(GL_QUADS);
            glNormal3f(0.000000,0.000000,1.000000);
            glVertex3f( -0.5f,  -0.5f,   +0.5f);
            glNormal3f(0.000000,0.000000,1.000000);
            glVertex3f( +0.5f,  -0.5f,   +0.5f);
            glNormal3f(0.000000,0.000000,1.000000);
            glVertex3f( +0.5f,  +0.5f,   +0.5f);
            glNormal3f(0.000000,0.000000,1.000000);
            glVertex3f( -0.5f,  +0.5f,   +0.5f);
        glEnd();
        //********************* BACK FACE **************************
        glBegin(GL_QUADS);
            glNormal3f(0.000000,0.000000,-1.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( -0.5f,  -0.5f,  -0.5f);
            glNormal3f(0.000000,0.000000,-1.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( -0.5f,  +0.5f,  -0.5f);
            glNormal3f(0.000000,0.000000,-1.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( +0.5f,  +0.5f,  -0.5f);
            glNormal3f(0.000000,0.000000,-1.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( +0.5f,  -0.5f,  -0.5f);
        glEnd();
 }

 if (gc.xtex<255) {
        glEnable( GL_TEXTURE_2D );

        //******************** TILE CALC  *************************
        glBindTexture(GL_TEXTURE_2D, numbers->tex_id);
        s1 = (gc.xtex % numbers->nbtilew) * numbers->ofnormaltexx;
        s2 = s1 + numbers->ofnormaltexx;
        t1 = ((int)(gc.xtex/numbers->nbtilew)) * numbers->ofnormaltexy;
        t2 = t1 + numbers->ofnormaltexy;

        //************************ LEFT  FACE *************************
        glBegin(GL_QUADS);
            glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            //glTexCoord2f (1.0f, 1.0f);
            glTexCoord2f(s2, t2);
            glVertex3f( -0.5f,  -0.5f,   +0.5f);
            glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
//            glTexCoord2f (1.0f, 0.0f);
            glTexCoord2f(s2, t1);
            glVertex3f( -0.5f,  +0.5f,   +0.5f);
            glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            //glTexCoord2f (0.0f, 0.0f);
            glTexCoord2f(s1, t1);
            glVertex3f( -0.5f,  +0.5f,   -0.5f);
            glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            //glTexCoord2f (0.0f, 1.0f);
            glTexCoord2f(s1, t2);
            glVertex3f( -0.5f,  -0.5f,   -0.5f);
        glEnd();
        //************************ RIGHT  FACE ****************************
        glBegin(GL_QUADS);
            glNormal3f(1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
//            glTexCoord2f (1.0f, 1.0f);
            glTexCoord2f(s2, t2);
            glVertex3f( +0.5f,  -0.5f,  -0.5f);
            glNormal3f(1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
//            glTexCoord2f (1.0f, 0.0f);
            glTexCoord2f(s2, t1);
            glVertex3f( +0.5f,  +0.5f,  -0.5f);
            glNormal3f(1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
//            glTexCoord2f (0.0f, 0.0f);
            glTexCoord2f(s1, t1);
            glVertex3f( +0.5f,  +0.5f,  +0.5f);
            glNormal3f(1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
//            glTexCoord2f (0.0f, 1.0f);
            glTexCoord2f(s1, t2);
            glVertex3f( +0.5f,  -0.5f,  +0.5f);
        glEnd();
        glDisable( GL_TEXTURE_2D );
 } else {
        //************************ LEFT  FACE *************************
        glBegin(GL_QUADS);
            glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( -0.5f,  -0.5f,   +0.5f);
            glNormal3f(-1.000000,0.000000,0.000000);//lNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( -0.5f,  +0.5f,   +0.5f);
            glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( -0.5f,  +0.5f,   -0.5f);
            glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( -0.5f,  -0.5f,   -0.5f);
        glEnd();
        //************************ RIGHT  FACE ****************************
        glBegin(GL_QUADS);
            glNormal3f(1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( +0.5f,  -0.5f,  -0.5f);
            glNormal3f(1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( +0.5f,  +0.5f,  -0.5f);
            glNormal3f(1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( +0.5f,  +0.5f,  +0.5f);
            glNormal3f(1.000000,0.000000,0.000000);//            glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( +0.5f,  -0.5f,  +0.5f);
        glEnd();
 }

 if (gc.ytex<255) {
        glEnable( GL_TEXTURE_2D );

        //******************** TILE CALC  *************************
        glBindTexture(GL_TEXTURE_2D, numbers->tex_id);
        s1 = (gc.ytex % numbers->nbtilew) * numbers->ofnormaltexx;
        s2 = s1 + numbers->ofnormaltexx;
        t1 = ((int)(gc.ytex/numbers->nbtilew)) * numbers->ofnormaltexy;
        t2 = t1 + numbers->ofnormaltexy;

        //***************************** TOP  FACE **************************
        glBegin(GL_QUADS);
            glNormal3f(0.000000,1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
//            glTexCoord2f (0.0f, 1.0f);
            glTexCoord2f(s1, t2);
            glVertex3f( -0.5f,   +0.5f,   +0.5f);
            glNormal3f(0.000000,1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
//            glTexCoord2f (1.0f, 1.0f);
            glTexCoord2f(s2, t2);
            glVertex3f( +0.5f,   +0.5f,   +0.5f);
            glNormal3f(0.000000,1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
//            glTexCoord2f (1.0f, 0.0f);
            glTexCoord2f(s2, t1);
            glVertex3f( +0.5f,   +0.5f,   -0.5f);
            glNormal3f(0.000000,1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
//            glTexCoord2f (0.0f, 0.0f);
            glTexCoord2f(s1, t1);
            glVertex3f( -0.5f,   +0.5f,   -0.5f);
        glEnd();
        //************************* BOTTOM FACE ****************************
        glBegin(GL_QUADS);
            glNormal3f(0.000000,-1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
//            glTexCoord2f (0.0f, 0.0f);
            glTexCoord2f(s1, t1);
            glVertex3f( -0.5f,  -0.5f,   +0.5f);
            glNormal3f(0.000000,-1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
//            glTexCoord2f (0.0f, 1.0f);
            glTexCoord2f(s1, t2);
            glVertex3f( -0.5f,  -0.5f,   -0.5f);
            glNormal3f(0.000000,-1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
//            glTexCoord2f (1.0f, 1.0f);
            glTexCoord2f(s2, t2);
            glVertex3f( +0.5f,  -0.5f,   -0.5f);
            glNormal3f(0.000000,-1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
//            glTexCoord2f (1.0f, 0.0f);
            glTexCoord2f(s2, t1);
            glVertex3f( +0.5f,  -0.5f,   +0.5);
        glEnd();
        glDisable( GL_TEXTURE_2D );
    } else {
        //***************************** TOP  FACE **************************
        glBegin(GL_QUADS);
            glNormal3f(0.000000,1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( -0.5f,   +0.5f,   +0.5f);
            glNormal3f(0.000000,1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( +0.5f,   +0.5f,   +0.5f);
            glNormal3f(0.000000,1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( +0.5f,   +0.5f,   -0.5f);
            glNormal3f(0.000000,1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( -0.5f,   +0.5f,   -0.5f);
        glEnd();
        //************************* BOTTOM FACE ****************************
        glBegin(GL_QUADS);
            glNormal3f(0.000000,-1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( -0.5f,  -0.5f,   +0.5f);
            glNormal3f(0.000000,-1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( -0.5f,  -0.5f,   -0.5f);
            glNormal3f(0.000000,-1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( +0.5f,  -0.5f,   -0.5f);
            glNormal3f(0.000000,-1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
            glVertex3f( +0.5f,  -0.5f,   +0.5);
        glEnd();
    }





}


void DrawWireCube() {           // draws the wire cube to display the grid
    // FRONT
    glBegin(GL_LINE_LOOP);
        glVertex3f( -0.5f,  -0.5f,   +0.5f);
        glVertex3f( +0.5f,  -0.5f,   +0.5f);
        glVertex3f( +0.5f,  +0.5f,   +0.5f);
        glVertex3f( -0.5f,  +0.5f,   +0.5f);
    glEnd();
    // BACK
    glBegin(GL_LINE_LOOP);
        glVertex3f( -0.5f,  -0.5f,  -0.5f);
        glVertex3f( -0.5f,  +0.5f,  -0.5f);
        glVertex3f( +0.5f,  +0.5f,  -0.5f);
        glVertex3f( +0.5f,  -0.5f,  -0.5f);
    glEnd();
    // LEFT
    glBegin(GL_LINE_LOOP);
        glVertex3f( -0.5f,  -0.5f,   +0.5f);
        glVertex3f( -0.5f,  +0.5f,   +0.5f);
        glVertex3f( -0.5f,  +0.5f,   -0.5f);
        glVertex3f( -0.5f,  -0.5f,   -0.5f);
    glEnd();
    // RIGHT
    glBegin(GL_LINE_LOOP);
        glVertex3f( +0.5f,  -0.5f,  -0.5f);
        glVertex3f( +0.5f,  +0.5f,  -0.5f);
        glVertex3f( +0.5f,  +0.5f,  +0.5f);
        glVertex3f( +0.5f,  -0.5f,  +0.5f);
    glEnd();
    // TOP
    glBegin(GL_LINE_LOOP);
        glVertex3f( -0.5f,   +0.5f,   +0.5f);
        glVertex3f( +0.5f,   +0.5f,   +0.5f);
        glVertex3f( +0.5f,   +0.5f,   -0.5f);
        glVertex3f( -0.5f,   +0.5f,   -0.5f);
    glEnd();
    // BOTTOM
    glBegin(GL_LINE_LOOP);
        glVertex3f( -0.5f,  -0.5f,   +0.5f);
        glVertex3f( -0.5f,  -0.5f,   -0.5f);
        glVertex3f( +0.5f,  -0.5f,   -0.5f);
        glVertex3f( +0.5f,  -0.5f,   +0.5f);
    glEnd();

}
quando premi il mouse incomincia a rimpicciolire i cubi.
l'ho messo a 10 fps per notare meglio il colore che "sbianca "
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline raistlin77it

  • Tech Guru
  • *****
  • Post: 221
  • Karma: +2/-0
    • Mostra profilo
Re: [C][OPENGL] lightning e colore
« Risposta #9 il: 11 Ottobre 2011, 17:42:22 »
Trovato :D :D

Giustamente il titolo della guida che ho seguito è "Avoiding 16 Common OpenGL Pitfalls"
E spiega che anche se io scalo prima di disegnare il cubo, le normali vengono alterate da opengl, la soluzione + semplice è chiamare glEnable(GL_NORMALIZE); che riporta le normali a 1.0 oppure scalare i vertici a "manina" prima di disegnarli (figuramoci, non siamo mica con le gl4.0 )

dalle gl 2.1 in poi si può usare glEnable(GL_RESCALE_NORMAL); che non ricalcola le normali ma le riscala  inversamente rispetto all'opeazione fatta con glscale
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: [C][OPENGL] lightning e colore
« Risposta #10 il: 11 Ottobre 2011, 19:02:23 »
Ci avrei giurato che ti riscalava le normali, ma non essendo un graphics programmer non ero sicurissimo al 100%
:-)
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Tags: