Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Вот то что я понимаю под синглсюрфейс. Пытался сделать легкий доступ к кваду и вроде получилось. Осталось нормальный контроль кол-ва сделать и можно будет кой-чо делать.

// вектор в тридэ
class float3 {
public:
float x;
float y;
float z;
float3(){
x=0.0f;
y=0.0f;
z=0.0f;
}
void set(float a, float b,float c)
{
x=a; y=b;z=c;
}
};
//вершина
class vert_data {
public:
int index;
Handle surf;
float3 *position;
float3 *normal;
vert_data(){
position= new float3;
normal= new float3;
}
void setnormal(float a, float b,float c){
xVertexNormal(surf,index,a,b,c);
normal->set(a,b,c);}
void setposition(float a, float b,float c){
xVertexCoords(surf,index,a,b,c);
xVertexTexCoords(surf,index,a,c);
position->set(a,b,c);}
/*
обновление нормали.
есть четыре вектора (1,0,val00-val10) (0,1,val00-val01) (-1,0,val00-(val-10)) (0,1,val00-(val0-1))
попарно векторное умножение даст четыре нормали сумма/4 результирующая нормаль.
одно вычисление валидно для четырех квадов
*/
};
//квад
class quad {
public:
Handle surf;
vert_data *v00;
vert_data *v01;
vert_data *v10;
vert_data *v11;
int index;
quad(){
v00= new vert_data;
v01= new vert_data;
v10= new vert_data;
v11= new vert_data;
}
};
//менеджер квадов
class manager {
public:
Handle mesh;
//массив под поверхности
Handle *surf;
// массив квадов
// сикока квадо увсего
int cquad;
quad **sys;
//размер элемента группы квадов.
int size;
//methods area
//constructor
manager();
};
manager :: manager(){
//ограничение числа индексов в 65536
//значит число квадов в поверхности
int quadnum=256*64;
cquad=0;
mesh=xCreateMesh();
int number=4;
surf= new Handle[number];
sys = new quad*[quadnum*number];
for(int i=0;i<number;i++){
surf[i]=xCreateSurface(mesh);
for(int j=0;j<quadnum;j++){
int v00=xAddVertex(surf[i],0,0,0,0,0);
int v01=xAddVertex(surf[i],0,0,0,0,0);
int v10=xAddVertex(surf[i],0,0,0,0,0);
int v11=xAddVertex(surf[i],0,0,0,0,0);
xAddTriangle(surf[i],v00,v01,v10);
xAddTriangle(surf[i],v01,v11,v10);
//заполнение данными вышележащей(или глубже) структуры
sys[cquad]=new quad;
sys[cquad]->index=cquad;
sys[cquad]->surf=surf[i];
sys[cquad]->v00->index=v00; sys[cquad]->v00->surf=sys[cquad]->surf; sys[cquad]->v00->setposition(0.0f,0.0f,0.0f); sys[cquad]->v00->setnormal(0.0f,1.0f,0.0f);
sys[cquad]->v10->index=v10; sys[cquad]->v10->surf=sys[cquad]->surf; sys[cquad]->v10->setposition(1.0f,0.0f,0.0f); sys[cquad]->v10->setnormal(0.0f,1.0f,0.0f);
sys[cquad]->v01->index=v01; sys[cquad]->v01->surf=sys[cquad]->surf; sys[cquad]->v01->setposition(0.0f,0.0f,1.0f); sys[cquad]->v01->setnormal(0.0f,1.0f,0.0f);
sys[cquad]->v11->index=v11; sys[cquad]->v11->surf=sys[cquad]->surf; sys[cquad]->v11->setposition(1.0f,0.0f,1.0f); sys[cquad]->v11->setnormal(0.0f,1.0f,0.0f);
cquad++;
}
}
}
итоговый управляющий код:
manager uno;
for(int i=0;i<uno.cquad;i++){
uno.sys[i]->v00->setposition(i,i,0); uno.sys[i]->v00->setnormal(0,1,0);
uno.sys[i]->v10->setposition(i+1,i+1,0); uno.sys[i]->v10->setnormal(0,1,0);
uno.sys[i]->v01->setposition(i,i,1); uno.sys[i]->v01->setnormal(0,1,0);
uno.sys[i]->v11->setposition(i+1,i+1,1); uno.sys[i]->v11->setnormal(0,1,0);
}
xCalculateFrustumVolume(uno.mesh);
Смысл в том что одной поверхностью можно имитировать наличие нескольких тысяч частиц, тех же спрайтов к примеру. И рисоваться они будут за один дип вместо нескольких тысяч. На примере своего ландшафта я понял, что чем больше треугольников в одном дипе тем лучше. так как, что при 30к треугольников на экране, что при 150к фпс оставался практически идентичным даже на встроенном в сандибридж видео.
Последний раз редактировалось dsd, 29.10.2011 в 16:24.
|