Тема: Странное.
Показать сообщение отдельно
Старый 28.10.2011, 20:53   #185
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

Написал генератор отклонения нормали от нормального положения для шейдераф. Бесшовный. Быстрый относительно. С настройками.



int ARGB (int a,int r,int b, int g){
int color=(a<<24)+(r<<16)+(b<<+g;
return color;
}
//генератор градиентного трехканального шума
Handle GrimMagicPikcha(int size, double sharp, int seed){

xSeedRnd(seed);
//создается массив для значений

double **m0[size+1];
for(int i=0;i<=size;i++){m0[i]= new double*[size+1];}
for(int i=0;i<=size;i++){
for(int j=0;j<=size;j++){
m0[i][j]= new double[3];}}


for(int k=0;k<3;k++){

for(int i=0;i<=size;i++){
for(int j=0;j<=size;j++){
m0[i][j][k]=0;
}
}
//заполнение краев случайными числами (-5;5)
m0[0][0][k]=xRnd(-5,5);
m0[size][0][k]=xRnd(-5,5);
m0[0][size][k]=xRnd(-5,5);
m0[size][size][k]=xRnd(-5,5);

int step=size>>1;
while(step>0){
//первая строка
for(int i=step;i<=size-step;i=i+2*step){
for(int j=step;j<=size-step;j=j+2*step){

//вычисление необходимых индексов
int x0=i-step;
if(x0<0){x0=x0+size;}
int x1=i+step;
if(x1>=size){x1=x1-size;}
int y0=j-step;
if(y0<0){y0=y0+size;}
int y1=j+step;
if(y1>=size){y1=y1-size;}

double val00=m0[x0][y0][k];
double val01=m0[x0][y1][k];
double val10=m0[x1][y0][k];
double val11=m0[x1][y1][k];

if(m0[i][j][k]==0 && val00!=0 && val01!=0 && val10!=0 && val11!=0){
m0[i][j][k]=0.25*(val00+val01+val10+val11)+step*xRnd(-sharp,sharp);
m0[x0][j][k]=0.5*(val00+val01)+0.5*step*xRnd(-sharp,sharp);
m0[x1][j][k]=0.5*(val10+val11)+0.5*step*xRnd(-sharp,sharp);
m0[i][y0][k]=0.5*(val00+val10)+0.5*step*xRnd(-sharp,sharp);
m0[i][y1][k]=0.5*(val01+val11)+0.5*step*xRnd(-sharp,sharp);}
}
}
step=step>>1;
}
//приведение значений в массивах в интервал (0;1)
double max=0;
double min=0;
for (int i=0;i<=size;i++){
for (int j=0;j<=size;j++){
if(m0[i][j][k]>=max){max=m0 [i][j][k];}
if(m0[i][j][k]<=min){min=m0 [i][j][k];}
}
}

double length=max-min;
for (int i=0;i<=size;i++){
for (int j=0;j<=size;j++){
m0[i][j][k]=(m0 [i][j][k]-min)/length;
}
}
}

//*************************************
//дальше вывод значений
Handle tex=xCreateTexture(size,size);
xSetBuffer(xTextureBuffer(tex));
xLockBuffer(xTextureBuffer(tex));
for (int i=0;i<size;i++){
for (int j=0;j<size;j++){
double val0=m0 [i][j][0];
double val1=m0 [i][j][1];
double val2=m0 [i][j][2];
xWritePixelFast(i,j,ARGB(255,val0*255,val1*255,val 2*255),xTextureBuffer(tex));
}
}
xSetBuffer(xBackBuffer());
xUnlockBuffer(xTextureBuffer(tex));

return tex;

}
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Reizel (29.10.2011)