19.10.2011, 20:14
|
#130
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Привел шум в более приличный вид и ускорил его до почти приемлемого уровня, но он все равно пока медленней даймонда в size раз.


Handle perlin_noise(int seed, int size){
srand(seed);
int resolution=1<<size;
//создание структуры данных
float **m1[size];
for(int i=0;i<size;i++){
m1[i]=new float*[resolution];
for(int j=0;j<resolution;j++){m1[i][j]=new float[resolution];}}
//обнуление
for(int i=0;i<size;i++){for(int j=0;j<resolution;j++){for(int k=0;k<resolution;k++){m1[i][j][k]=0;}}}
//создание исходного шума
float length=0;
for(int i=0;i<size;i++){
int width=1<<(i+1);
//kof коэффициент веса октавы
float kof=(size-i);
if(i==0){kof=8.01;}
if(i==1){kof=4.51;}
if(i==2){kof=2.51;}
if(i==3){kof=1.01;}
if(i==4){kof=0.81;}
if(i==5){kof=0.51;}
if(i>5){kof=0.24;}
for(int j=0;j<width;j++){for(int k=0;k<width;k++){m1[i][j<<(size-i-1)][k<<(size-i-1)]=kof*(1-2*(float)rand()/RAND_MAX);}}
//cуммируется вес октав это будет максимально возможный перепад высот
length=length+kof;}
//что бы коегде заменить все деления умножением
float len=(0.5/length);
//тут градиентный шум считается
for(int k=0;k<size-1;k++){
int step=resolution>>1;
while(step>0){
for(int i=step;i<resolution-step;i=i+2*step){
for(int j=step;j<resolution-step;j=j+2*step){
//данные в углах текущей клетки
float val00=m1[k][i-step][j-step];
float val01=m1[k][i-step][j+step];
float val10=m1[k][i+step][j-step];
float val11=m1[k][i+step][j+step];
//если текущая клетка пуста, то пишется в клетку крест значений
if(m1[k][i][j]==0){
m1[k][i][j]=0.25*(val00+val01+val10+val11);
m1[k][i-step][j]=0.5*(val00+val01);
m1[k][i+step][j]=0.5*(val10+val11);
m1[k][i][j-step]=0.5*(val00+val10);
m1[k][i][j+step]=0.5*(val01+val11);}
}}
step=step>>1;}}
//суммирование в последний массив
for(int i=0;i<resolution;i++){for(int j=0;j<resolution;j++){for(int k=0;k<size-1;k++){m1[size-1][i][j]=m1[size-1][i][j]+m1[k][i][j];}m1[size-1][i][j]=(m1[size-1][i][j]+length)*len;}}
//рисование текстуры
Handle tex=xCreateTexture(resolution,resolution);
xSetBuffer(xTextureBuffer(tex));
xLockBuffer(xTextureBuffer(tex));
for (int i=0;i<resolution;i++){
for (int j=0;j<resolution;j++){
float val=pow(m1[size-1][i][j],2);
int red,green,blue;
if(val<=0.25) {blue=(1-val)*255; green=125*(1-val);red=0;} //цвет моря
else {if(val>=0.5) {red=205*val; green=120*val;blue=70;} //цвет гор
else{red=255*val; green=255*val;blue=0;}} //цвет от побережья до предгорий
xWritePixelFast(i,j,(255<<24)+(red<<16)+(green<<8)+blue,xTextureBuffer(tex));}}
xSetBuffer(xBackBuffer());
xUnlockBuffer(xTextureBuffer(tex));
return tex;}
|
|
(Offline)
|
|