|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
30.10.2008, 15:33 | #1 |
Заблокирован
Старожил
Регистрация: 20.07.2008
Сообщений: 4,032
|
Амплитуда
Здравствуйте!!!
Хочу сделать график отображающий амплитуду на колонках, но не знаю как (амплитуду) узнать.(Delphi) И еще, как в OpenGl сделать эффект “ Внешнего свечения“ ? Последний раз редактировалось SuperVisor; 07.12.2008 в 23:10. Причина: Есть кнопка редактировать. |
07.12.2008, 22:33 | #2 | |
Регистрация: 07.12.2008
Сообщений: 8
|
Цитата:
Итак, начнем по порядку, тебе надо написать свой модуль или библу воспроизведения муз файлов или прямого чтения со звуковой карты, или можно взять чужую, например BASS или FMOD Вот пример про BASS: // Добавь bass.lib еще #include "bass.h" ... #define SPECWIDTH 368 // Ширина спектра #define SPECHEIGHT 127 // Высота спектра ... HMUSIC Music; // Музон DWORD len,dec,chan; // Музон: длина, положение, объект float fft[1024], Y_Pos[28] //Сюда будет попадать сила спектра канала от 0.0 до 1.0 ; int b0, x, y ; ... BASS_Init(-1,44100,0,NULL,NULL); // Инициализация Music=BASS_StreamCreateFile(FALSE," Music.mp3",0,0,0); // Загрузка mp3 BASS_ChannelPlay(Music,TRUE); // Начинаем играть ... // Функция взятия спектра (28 штук) void GetStreamMusic() { b0=0; BASS_ChannelGetData(Music,fft,BASS_ DATA_FFT2048); #define BANDS 28 for (x=0;x<BANDS;x++) { float sum=0; int sc=pow(2.0,x*10.0/(BANDS-1)); int b1=pow(2.0,x*10.0/(BANDS-1)); if (b1>1023) b1=1023; if (b1<=b0) b1=b0+1; sc=10+b1-b0; for (;b0<b1;b0++) sum+=fft[1+b0]; y=(sqrt(sum/log10(float(sc)))*1.7*SPECHEIGHT)-4; if (y>SPECHEIGHT) y=SPECHEIGHT; Y_Pos[x]=y*2; Y_Pos[x]=Y_Pos[x]/255; } len=BASS_StreamGetFilePosition(Musi c,BASS_FILEPOS_END); dec=BASS_StreamGetFilePosition(Musi c,BASS_FILEPOS_CURRENT); if (dec>(len-10)) END=true; } ... GetStreamMusic(); // Вызов функции, после которой в Y_Pos[28] // попадает спектрум звучания // тут 28 каналов // Ну и например glTranslatef(0,Y_Pos[0],0) // Тут позиция Y будет зависеть от бассов песни // басы [0][1][2][3] и.т.д. Ваще, если надо очень напиши мыло свое - могу отправить рабочий исходник на С++ |
|
07.12.2008, 22:42 | #3 |
Регистрация: 07.12.2008
Сообщений: 8
|
То что ты хошь называется:
Радиальное размытие и текстурный рендеринг Так что.. впрочем, вот просто код на С++ и OpenGL //------------------------------------------------------------------------- GLuint EmptyTexture() { // Создаем текстуру новую GLuint txtnumber; unsigned int* data; data = (unsigned int*)new GLuint[((256 * 256)* 4 * sizeof(unsigned int))]; ZeroMemory(data,((256 * 256)* 4 * sizeof(unsigned int))); glGenTextures(1, &txtnumber); glBindTexture(GL_TEXTURE_2D, txtnumber); glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); glTexParameteri(GL_TEXTURE_2D,GL_TE XTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TE XTURE_MAG_FILTER,GL_LINEAR); delete [] data; return txtnumber; } //------------------------------------------------------------------------- void ReduceToUnit(float vector[3]) { float length; length = (float)sqrt((vector[0]*vector[0]) + (vector[1]*vector[1]) + (vector[2]*vector[2])); if(length == 0.0f) length = 1.0f; vector[0] /= length; vector[1] /= length; vector[2] /= length; } //------------------------------------------------------------------------- void calcNormal(float v[3][3], float out[3]) { float v1[3],v2[3]; static const int x = 0; static const int y = 1; static const int z = 2; v1[x] = v[0][x] - v[1][x]; v1[y] = v[0][y] - v[1][y]; v1[z] = v[0][z] - v[1][z]; v2[x] = v[1][x] - v[2][x]; v2[y] = v[1][y] - v[2][y]; v2[z] = v[1][z] - v[2][z]; out[x] = v1[y]*v2[z] - v1[z]*v2[y]; out[y] = v1[z]*v2[x] - v1[x]*v2[z]; out[z] = v1[x]*v2[y] - v1[y]*v2[x]; ReduceToUnit(out); } //------------------------------------------------------------------------- void Process(float X, float Y, float Z, float Red, float Green, float Blue, int TODO ) { int phi; GLfloat glfMaterialColor[]={1,1,1,1.0f}; GLfloat specular[]={Red,Green,Blue,1.0f}; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glPushMatrix(); glTranslatef(X,Y,Z); glRotatef(angle/3.0f,0,0,1); glMaterialfv(GL_FRONT_AND_BACK,GL_A MBIENT_AND_DIFFUSE,glfMaterialColor ); glMaterialfv(GL_FRONT_AND_BACK,GL_S PECULAR,specular); glColor4f(1,1,1,1); // Сюда рисуй че хочешь засветить glPopMatrix(); } //------------------------------------------------------------------------- void RenderToTexture() { glViewport(0,0,256,256); glBindTexture(GL_TEXTURE_2D,0); // ! Process(HelX,HelY,HelZ,HelRed,HelGr een,HelBlue, HelTODO); glBindTexture(GL_TEXTURE_2D,BlurTex ture); glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0, 256, 256, 0); glViewport(0 , 0, OknoX , OknoY); } // Тут создается свечение //------------------------------------------------------------------------- void DrawBlur(int times, float inc) { float spost = 0.0f; float alphainc = 0.1f / times; float alpha = 0.4f; glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glBlendFunc(GL_SRC_ALPHA,GL_ONE); glBindTexture(GL_TEXTURE_2D,BlurTex ture); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho( 0, 1024, 768 , 0, -1, 1 ); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); float DF=(Y_Pos[0]+Y_Pos[1]+Y_Pos[2]+Y_Pos[3])/3; alphainc = alpha / times; glBegin(GL_QUADS); for (int num = 0;num < times;num++) { glColor4f(1.0f, 1.0f, 1.0f, alpha); glTexCoord2f(0+spost,1-spost); glVertex2f(0,0); glTexCoord2f(0+spost,0+spost); glVertex2f(0,OknoY); glTexCoord2f(1-spost,0+spost); glVertex2f(OknoX,OknoY); glTexCoord2f(1-spost,1-spost); glVertex2f(OknoX,0); spost += inc; alpha = alpha - alphainc; } glEnd(); glMatrixMode( GL_PROJECTION ); glPopMatrix(); glMatrixMode( GL_MODELVIEW ); glPopMatrix(); glBindTexture(GL_TEXTURE_2D,0); glColor4f(1,1,1,1); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); GLfloat specular[]={0.2,0.2,0.2,1.0f}; glMaterialfv(GL_FRONT_AND_BACK,GL_S PECULAR,specular); } // ну и потом HelZ=0; HelX=0; HelY=0; angle=0; HelRed=0; HelGreen=1; HelBlue=1; HelTODO=0; BlurTexture = EmptyTexture(); RenderToTexture(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); Process(HelX,HelY,HelZ,HelRed,HelGr een,HelBlue,HelTODO); // Тут рисуй че нить че не надо светить DrawBlur(10,0.02f); //-------------- Тоже самое - надо оч пиши мыло - отправлю исходник Советую книгу NEHE по программингу на OpenGL Писать ща коменты к каждой строке нет смысла, так что лучше спросить че не ясно |