VDragon
кстати о последнем скрине, ожило, но цвет, немного зеленоватое оно какоето
Там зеленого ничего нет. Если ты имеешь ввиду те места где частици становятся прозрачными и их жизненный цикл уже заканчивается то это бледно бледно желтый ;)
Вот еще скрин
шутка это я в пейнт нете сделал ;)
Собратья, единомышленики, друзья, что-то я увлекся подскажите как можно реализовать огонь хотябы немного похожий на Это скриншот.
Mekrod
У меня вот такой огонь. Подойдет?
alex-r
Вполне подайдет. Вот что я навоял.
Оцените какой лучше.
дурацкая идея - но вдруг покатит...
в незапамятные времена (ДОС 5.0, 640 кб оперативы, 320х200х256 цветов и Турбо-С) была масса красивых демок с огнем. насколько я помню, некоторые из них были очень даже реалистичные. если пошукать по сети таких древних исходничков, то там можно массу вдохновения почерпнуть :)
Mekrod
Срочно нужен HDR :)
Sergio666
Да только проблема у меня с HDR знаю что это, только как этим пользоваться в движке не знаю.
Но сначала нужно узнать как делать карты HDR.
А потом как их применять.
Ну и еще вопрос зачем при менять HDR к огню. И что это даст.
На сколько я знаю HDR применяю для моделей, дабы придать им еще больше реализма. Если я неошибаюсь.
High Dynamic Range Rendering, часто сокращается до High Dynamic Range — графический эффект, применяемый в играх для наиболее выразительного рендеринга изображения при контрастном освещении сцены. Включает в себя несколько компонентов
alex-r поделись техникой красиво
Вот еще потрудился перед сном.
Правда один косяк при приближении камеры ФПС падает до 5. Сделаю поправку, делал всетаки на ноуте. Да и видюха Mobile Intel(R) 4;
Да, в принципе, ничего сложного у меня нет :)
Обычная система частиц: настраивается размер, цвет, макс. время жизни. Используется затухание по мере "умирания" частицы.
Рисуется биллбордами. Текстура огня выдрана из движка SPARK, некоторые идеи тоже :)
В шейдере делается поворот текстуры огня в зависимости от времени жизни (чтобы совсем однородно все не было).
Да, и еще при умирании частицы огня на ее месте добавляется частица дыма. Естественно, все рандомизировано (в смысле параметров).
Если нужны какие-то подробности, отвечу
текстуркой не поделитесь ?
I
По поводу паинт нета, старых турбоси и генерации огня...
делалось это както так...
тут откомпиленное: http://stream.ifolder.ru/13842415
#include <windows.h>
#include <math.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <sdl.h>
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDLmain.lib")
SDL_Surface *screen,*fire,*fire2;
SDL_Event evnt;
Uint32 timer = SDL_GetTicks();
Uint32 fps = 0;
GLUquadricObj *o;
SDL_Color colormap[256];
GLuint texture;
void bild_ramp(int from, SDL_Color fromcolor, int to, SDL_Color tocolor){
if (from>to) {
int temp=to;
to=from;
from=temp;
}
int len=to-from;
float r=(float)(tocolor.r-fromcolor.r)/len;
float g=(float)(tocolor.g-fromcolor.g)/len;
float b=(float)(tocolor.b-fromcolor.b)/len;
for (int i=0;i<len;i++){
colormap[i+from].r=(r*i)+fromcolor.r;
colormap[i+from].g=(g*i)+fromcolor.g;
colormap[i+from].b=(b*i)+fromcolor.b;
}
}
void pix(int x, int y, unsigned char color){
if (((x>=fire->w)||(x<0))||((y>=fire->h)||(y<0))) return;
((unsigned char *)fire->pixels)[x+y*fire->w]=color;
}
unsigned char gpix(int x, int y){
if (((x>=fire->w)||(x<0))||((y>=fire->h)||(y<0))) return 0;
return ((unsigned char *)fire->pixels)[x+y*fire->w];
}
void burn(){
char *pxl;
for (int j = fire->h-9;j<fire->h-2;j++)
for (int i = 0;i<fire->w;i++)
pix(i,j,rand());
for (int k=0;k<2;k++)
for (int j = 15;j<fire->h-5;j++)
for (int i = 0;i<fire->w;i++){
pix(i,j,(
gpix(i,j)+
gpix(i+1,j)+
gpix(i-1,j)+
gpix(i,j+1)+
gpix(i,j+1)+
gpix(i,j+2)+
gpix(i,j+3)+
gpix(i,j+3)
)>>3
);
}
}
void DrawScene(){
burn();
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
SDL_BlitSurface(fire,0,fire2,0);
glBindTexture(GL_TEXTURE_2D,texture);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,fire2->w,fire2->h-16,1,GL_RGBA,GL_UNSIGNED_BYTE,fire2->pixels);
glEnable(GL_TEXTURE_2D);
glPushMatrix();
glScalef(1,0.6,0.2);
glBegin(GL_QUADS);
glTexCoord2f(1,1);
glVertex3f(-1,-1,-1);
glTexCoord2f(0,1);
glVertex3f(1,-1,-1);
glTexCoord2f(0,0.01);
glVertex3f(1,1,-1);
glTexCoord2f(1,0.01);
glVertex3f(-1,1,-1);
glEnd();
glRotatef(90,0,1,0);
glPopMatrix();
glPushMatrix();
glTranslatef(0,0.5,0);
glRotatef(90,1,0,0);
glTranslatef(0,0,-0.5);
glRotatef(180,0,0,1);
gluCylinder(o,0.2,0.2,1,20,1);
glPopMatrix();
glDisable(GL_TEXTURE_2D);
SDL_GL_SwapBuffers();
}
void InitGL(){
glViewport(0,0,screen->w,screen->h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat aspectRatio=(GLfloat)screen->w/(GLfloat)screen->h;
GLfloat zoom = 1;
GLfloat n=1;
if (screen->w <= screen->h)
glOrtho (-zoom,zoom,-zoom/aspectRatio,zoom/aspectRatio,-1,1);
else
glOrtho (-zoom*aspectRatio,zoom*aspectRatio,-zoom,zoom,-1,1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_BLEND);
o=gluNewQuadric();
gluQuadricTexture(o,GL_TRUE);
}
int main(int argc, char *argv[]){
if (SDL_Init(SDL_INIT_VIDEO)<0) return 1;
atexit(SDL_Quit);
screen = SDL_SetVideoMode(400,400,32,SDL_OPENGL);
InitGL();
SDL_Color a={0,0,0};
SDL_Color b={255,60,0};
bild_ramp(110,a,120,b);
a.r=255;
a.g=200;
a.b=0;
bild_ramp(120,b,130,a);
b.r=255;
b.g=255;
b.b=255;
bild_ramp(130,a,200,b);
bild_ramp(200,b,256,b);
glEnable(GL_TEXTURE_2D);
glGenTextures(1,&texture);
glBindTexture(GL_TEXTURE_2D,texture);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
fire = SDL_CreateRGBSurface(SDL_SWSURFACE,128,128,8,0,0,0,0);
fire2 = SDL_CreateRGBSurface(SDL_SWSURFACE,fire->w,fire->h,32,0x000000FF,0x0000FF00,0x00FF0000,0xFF000000);
SDL_SetPalette(fire,0,colormap,0,256);
SDL_SetColors(fire,colormap,0,256);
while(1){
DrawScene();
SDL_PollEvent(&evnt);
switch (evnt.type){
case SDL_QUIT: exit(0);
case SDL_KEYDOWN:
switch (evnt.key.keysym.sym){
case SDLK_ESCAPE: exit(0);
}
break;
}
SDL_Delay(1000/60);
fps++;
if ((SDL_GetTicks()-timer)>1000) {
printf("fps : %d\n",fps);
fps=0;
timer=SDL_GetTicks();
}
}
return 0;
}
KyHTEP
Посмотрел ссылку там ничего не работает, наверное все удалили.
Mekrod
тот HDR про который ты говорил это не техника это специальные текстуры
а тот HDR про который говорил Sergio666 это техника пост обработки при котором сначало вычесляется общяя яркость сцены а потом в соответствии коректность картинки
вот пример
без HDR
с HDR (сильное свечение справа это не HDR это Bloom)
Тема в архиве.