qba10 Temat założony przez niniejszego użytkownika |
[OpenGL] Nie mogę ustawić koloru rysowanego wielokąta » 2011-07-21 18:05:45 Witam. Mam programik który rysuje mi za pomocą tekstur w 2D pewną mapę; Po wygenerowaniu chcę na ten mapie narysować czerwony prostokąt. Próbuje zrobić to w taki sposób: glBegin( GL_POLYGON ); glColor3f( 1.0f, 0.0f, 0.0f );
glVertex3f( 0.0, 0.0, 0.0 ); glVertex3f( 0.0, 1.0, 0.0 ); glVertex3f( 1.0, 1.0, 0.0 ); glVertex3f( 1.0, 0.0, 0.0 );
glEnd();
Jednak gdy to zrobię to, funckja glColor3f( 1.0f, 0.0f, 0.0f );
powoduje że cała na rysowana mapa jest czerwona (generalnie wszystko jakby miało tylko odcień czerwony) |
|
DejaVu |
» 2011-07-21 18:11:16 Ustaw kolor biały to model będzie pokryty teksturą z prawidłowymi barwami.
glColor3f( 1.0f, 1.0f, 1.0f );
|
|
qba10 Temat założony przez niniejszego użytkownika |
» 2011-07-21 18:21:06 Ok tylko że ja chcę narysować ten prostokąt i chcę żeby miał czerwony kolor. A nie wiem czemu ta funkcja glcolor3f zamiast ustawic kolor tego prostokątu to zmienia barwe tekstur. |
|
m4tx |
» 2011-07-21 18:22:08 Ta funkcja nie zmienia tylko barwy tekstur, a zarówno kolor prostokąta jak i tekstury. |
|
qba10 Temat założony przez niniejszego użytkownika |
» 2011-07-21 18:27:22 Zmieniłem tamto na to bo się zorientowałem że tamto nie rysuje mi prostokąta: glColor3f( 1.0f, 1.0f, 1.0f ); glRecti( 100, 100, 200, 200 );
Efekt jest taki że mam narysowaną mapę i fioletowy prostokąt na tej mapie; Jak zmienić teraz kolor tego prostokąta ? |
|
DejaVu |
» 2011-07-21 20:49:51 Daj więcej kodu bo Twoje zeznania są sprzeczne z kodem, który wklejasz :) |
|
qba10 Temat założony przez niniejszego użytkownika |
» 2011-07-21 21:08:54 No to ok. Całego projektu nie dam bo nie wiem czy chce wam się przeglądać wszystkie pliki (jeżeli tak to pisać dam paczkę z cały projektem) Dam te metody gdzie używam OpenGl'a To inicjalizacja samego OpenGL void Core::initOpenGL() { glClearColor( 0, 0, 0, 0 ); glEnable( GL_TEXTURE_2D ); glEnable( GL_BLEND ); glEnable( GL_DEPTH_TEST ); glShadeModel( GL_SMOOTH ); glClearDepth( 1.0f ); glEnable( GL_DEPTH_TEST ); glDepthFunc( GL_LEQUAL ); glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glViewport( 0, 0,( GLsizei ) this->windowWidth,( GLsizei ) this->windowHeight ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho( 0,( GLsizei ) this->windowWidth,( GLsizei ) this->windowHeight, 0, - 1, 1 ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); }
Ładiowanie Sprite'a void Map::loadSpriteOpenGL( const char * file ) { SDL_Surface * surface; GLenum texture_format; GLint nofcolors; if(( surface = IMG_Load( file ) ) ) { if(( surface->w &( surface->w - 1 ) ) != 0 ) { cout << "OpenGL warning: texture's width is not a power of 2 " << endl; } this->widthOpenGLTexture = surface->w; if(( surface->h &( surface->h - 1 ) ) != 0 ) { cout << "OpneGL warning: texture's width is not a power of 2" << endl; } this->heightOpenGLTexture = surface->h; nofcolors = surface->format->BytesPerPixel; if( nofcolors == 4 ) { cout << "OpenGL: texture format: 4 BYTES PER PIXEL" << endl; if( surface->format->Rmask == 0x000000ff ) texture_format = GL_RGBA; else texture_format = GL_BGRA; } else if( nofcolors == 3 ) { cout << "OpenGL: texture format: 3 BYTES PER PIXEL" << endl; if( surface->format->Rmask == 0x000000ff ) texture_format = GL_RGB; else texture_format = GL_BGR; } else { cout << "OpenGL warning: the texture is not truecolor…this will break " << endl; } glGenTextures( 1, & this->openGLTexture ); glBindTexture( GL_TEXTURE_2D, this->openGLTexture ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexImage2D( GL_TEXTURE_2D, 0, nofcolors, surface->w, surface->h - 50, 0, texture_format, GL_UNSIGNED_BYTE, surface->pixels ); } else { printf( "SDL could not load texture: %s\n", SDL_GetError() ); SDL_Quit(); } if( surface ) { SDL_FreeSurface( surface ); } }
Rysowanie mapy void Map::drawTileOpenGL() { glClear( GL_COLOR_BUFFER_BIT ); glBindTexture( GL_TEXTURE_2D, this->openGLTexture ); GLfloat a; GLfloat b; a =( GLfloat ) this->tileSizeX / this->widthOpenGLTexture; b =( GLfloat ) this->tileSizeY / this->heightOpenGLTexture; int i; int bitmapElementsRows; int srcX; int srcY; int ax = 0; int ay = 0; for( int y = 0; y <=( int )( this->winHeight / this->tileSizeY ); y++ ) { for( int x = 0; x <=( int )( this->winWidth / this->tileSizeX ); x++ ) { ax = x + this->visibleX; ay = y + this->visibleY; if( ax < this->mapSizeX && ay < this->mapSizeY && ax >= 0 && ay >= 0 ) i = Area[ ax ][ ay ]; else i = 0; bitmapElementsRows = this->widthOpenGLTexture / this->tileSizeX; srcX = i % bitmapElementsRows; srcY = i / bitmapElementsRows; glBegin( GL_QUADS ); glTexCoord2f( srcX * a, srcY * b ); glVertex3i(( x ) * this->tileSizeX,( y ) * this->tileSizeY, 0 ); glTexCoord2f( srcX * a, srcY * b + b ); glVertex3i(( x ) * this->tileSizeX, ( y + 1 ) * this->tileSizeY, 0 ); glTexCoord2f( srcX * a + a, srcY * b + b ); glVertex3i(( x + 1 ) * this->tileSizeX, ( y + 1 ) * this->tileSizeY, 0 ); glTexCoord2f( srcX * a + a, srcY * b ); glVertex3i(( x + 1 ) * this->tileSizeX, ( y ) * this->tileSizeY, 0 ); glEnd(); } } }
No i rysowanie tego kochanego prostokąta glColor3f( 1.0f, 1.0f, 1.0f ); glRecti( 100, 100, 200, 200 );
Idzie to mniej więcej tak: 1) włączam program 2) inicjalizuje sie opengl 3) ładuje plik graficzny z sprite 4) dalej jest pętla i w petli na początku rysuje mape a potem próbuje narysować ten prostokąt; potem jeszcze rysuje napis za pomocą freetype przykładem z nehe lekcja 43 przykład dla SDL |
|
DejaVu |
» 2011-07-21 21:13:26 Spróbuj wyłączyć kanał alfa i GL_TEXTURE (czy coś podobnego) na czas rysowania prostokąta. |
|
« 1 » 2 |