LINUX.ORG.RU

Тормоизт текстурированный куб в OpenGL.


0

0

/***************************************************************************
main.cpp - description
-------------------
begin : Пнд Сен 15 23:30:09 MSD 2003
copyright : (C) 2003 by Alexandr
email : _cyclon_@mtu.ru
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream.h>
#include <stdlib.h>

#include "bmp.h"

#include "GL/glut.h"
#include "GL/gl.h"
#include "GL/glu.h"
#include <math.h>

GLdouble angel; //angel of rotated
GLdouble k = 8; //size

tagBITMAPFILEHEADER bmpFileHeader;
tagBITMAPINFOHEADER bmpInfoHeader;

int file_bmp,nCol,nRow,col;
tagRGBQUAD* flat;
tagRGBQUAD p;

char* pathFile;

void readFile(void)
{
file_bmp = open (pathFile, O_RDONLY);
read (file_bmp, &bmpFileHeader, 14);
read (file_bmp, &bmpInfoHeader, 40);
nCol = bmpInfoHeader.biWidth;
nRow = bmpInfoHeader.biHeight;
col = nRow*nCol;
flat = new tagRGBQUAD[col];
int n = 0;

for (int y = nRow; y > 0; y--)
{
for (int x = 0; x < nCol; x++)
{
read (file_bmp, &p, sizeof(p));
flat[n].b = (int)p.r;
flat[n].g = (int)p.g;
flat[n].r = (int)p.b;
n++;
}
}
}

void setTexture (void)
{
glMatrixMode( GL_MODELVIEW );

glTexImage2D(GL_TEXTURE_2D, 0, 3, nCol, nRow, 0, GL_RGB, GL_UNSIGNED_BYTE,flat);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glShadeModel(GL_FLAT);
}

void Init (void)
{
glMatrixMode(GL_PROJECTION);
gluPerspective(20.0, 1.0, 1.0, 30.0);
glMatrixMode(GL_MODELVIEW);
gluLookAt(0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.);
glOrtho(-12,12, -12,12, -20,20);
glEnable(GL_TEXTURE_2D);
}

void resize(int width,int height)
{
glClearColor(0.0,0.0,0.0,0.0);
glViewport(0,0,width,height);
}

void repaint(void)
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); //Function of clear window
///// Plase code here //////
setTexture();
glPushMatrix();
glBegin(GL_POLYGON);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0*k, -1.0*k, -1.0*k);
glTexCoord2f(0.0, 1.0);
glVertex3f(-1.0*k, -1.0*k, 1.0*k);
glTexCoord2f(1.0, 1.0);
glVertex3f(1.0*k, -1.0*k, 1.0*k);
glTexCoord2f(1.0, 0.0);
glVertex3f(1.0*k, -1.0*k, -1.0*k);
glEnd();
glBegin(GL_POLYGON);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0*k, 1.0*k, -1.0*k);
glTexCoord2f(0.0, 1.0);
glVertex3f(-1.0*k, 1.0*k, 1.0*k);
glTexCoord2f(1.0, 1.0);
glVertex3f( 1.0*k, 1.0*k, 1.0*k);
glTexCoord2f(1.0, 0.0);
glVertex3f( 1.0*k, 1.0*k, -1.0*k);
glEnd();
glBegin(GL_POLYGON);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0*k, -1.0*k, -1.0*k);
glTexCoord2f(0.0, 1.0);
glVertex3f(-1.0*k, 1.0*k, -1.0*k);
glTexCoord2f(1.0, 1.0);
glVertex3f( 1.0*k, 1.0*k, -1.0*k);
glTexCoord2f(1.0, 0.0);
glVertex3f( 1.0*k, -1.0*k, -1.0*k);
glEnd();
glBegin(GL_POLYGON);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0*k, -1.0*k, -1.0*k);
glTexCoord2f(0.0, 1.0);
glVertex3f(-1.0*k, 1.0*k, -1.0*k);
glTexCoord2f(1.0, 1.0);
glVertex3f( -1.0*k, 1.0*k, 1.0*k);
glTexCoord2f(1.0, 0.0);
glVertex3f( -1.0*k, -1.0*k, 1.0*k);
glEnd();
glBegin(GL_POLYGON);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0*k, -1.0*k, 1.0*k);
glTexCoord2f(0.0, 1.0);
glVertex3f(-1.0*k, 1.0*k, 1.0*k);
glTexCoord2f(1.0, 1.0);
glVertex3f( 1.0*k, 1.0*k, 1.0*k);
glTexCoord2f(1.0, 0.0);
glVertex3f( 1.0*k, -1.0*k, 1.0*k);
glEnd();
glBegin(GL_POLYGON);
glTexCoord2f(0.0, 0.0);
glVertex3f(1.0*k, -1.0*k, 1.0*k);
glTexCoord2f(0.0, 1.0);
glVertex3f(1.0*k, 1.0*k, 1.0*k);
glTexCoord2f(1.0, 1.0);
glVertex3f( 1.0*k, 1.0*k, -1.0*k);
glTexCoord2f(1.0, 0.0);
glVertex3f( 1.0*k, -1.0*k, -1.0*k);
glEnd();
glPopMatrix();
///////////////////////////////////////////
glutSwapBuffers();
}

void timer(int value)
{
glutPostRedisplay(); //Reshape function
glutTimerFunc(10, timer, 0); //Create loop of timers
angel = 1;
glRotated(angel,1,0,0);
}

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

pathFile = "/home/alexandr/Documents/Coding/C++/MyProjects/textures/textures/_24b.bmp& quot;;
readFile();

glutInitWindowSize(500, 550); //Position and
glutInitWindowPosition(100, 100); // size of window
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE ); //Mode of MainWindow
glutCreateWindow(" Created by Cyclon (_cyclon_@mtu.ru) "); //Create window with Caption

Init(); //Initalization function

glutReshapeFunc(resize); //Function for reshape
glutDisplayFunc(repaint); //Function for resize

glutTimerFunc(25, timer, 0); //Timer with 25ms interval

glutMainLoop(); //Just run main loop

return 0;
}

Есть такой код но после компиляции и запуска у меня эта байда начинает безбожно тормозить, что тем более странно ведь дрова от нвидии стоят и игрушки по типу туксрейсера не тормозят а прога проще которой только апельсин так тормозит.
Компилю с ключами -lGL -lGLU -lglut, один чел сказал что нужны какието особые ключи но он не знает какие, так ли это и как поправить эту ситуацию.

Заранее спасибо!!!

★★★★★

а зачем SetTexture каждый раз дергать?

anonymous
()

Переместил setTexture() в Init() но торможение осталось, хотя рендеринг немного ускорился. Видимо дело не только в этом.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

да, чего у тебя за код за такой? 25мс это думаю многовато, да и чего за блин рекурсия такая в timer еще каллбэк каждый раз дергать? да и перерисовку на reshape завязывать, надо оно те? там лучше только viewport меняй и матрицу, перерисовку на glutidlefunc повесить попробуй, или в timer можешь напрямую paint дергать.

anonymous
()
Ответ на: комментарий от cyclon

ну во-первых opengl.org - там полный спек и на gl и на glu и на glut есть

вкратце - когда приложение нихрена не делает то оно дергает функцию которую мы ему подсунули и сказали мол это idlefunc. Для скринсейверов и прочей лабуды полезно, неполезно если игрушку пишешь (да и то спорный вопрос, timerfunc что ты заюзал все равно точного времени не даст так что все равно разность счтитать придется)

примерно так (не помню уж нихрена)

repaint() { glClear(....) glРисуемВсякуюхрень(...) glutSwapBuffers(); }

resize() { glutViewport четотамеще }

glutIdleFunc(repaint) glutReshapeFunc(resize)

да кстати, это точно не в винде пускается? у меня в линухе нормально было, в винде тормозило. И ты линкуешь с чем? с нвидиевской libGL или с какой-нить libMesaGL?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.