forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Странное. (http://forum.boolean.name/showthread.php?t=15405)

HolyDel 15.08.2012 13:30

Ответ: Странное.
 
Чтобы не брало с края текстуры - можно задать clamp фильтрацию у текстуры.

dsd 02.11.2012 01:59

Ответ: Странное.
 
Вложений: 1
зачем то сделал класс который трехмерный массив из 0 и 1 рисует кубиками, одной поверхностью...

Код:


float rand(float min, float max)
{
 return (max-min)*rand()/(float)RAND_MAX;
}



class chunk_Surf
    {
    /*
    Это из трехмерного массива может сделать меш
    */
    public:

    //variables place

    Handle mesh;
    Handle surf;
    Handle tex;
    int size;
    int * test_data;


    //func place
chunk_Surf()
    {
        tex=xLoadTexture("media/1.jpg");
        size = 16;
        test_data = new int [ size * size * size ];
        for ( int i = 0; i < size * size * size; i ++ )
        {
          test_data[ i ] =(int) floor(rand( 0 , 2 ));
        }



        mesh = xCreateMesh();
        surf = xCreateSurface(mesh);

        for(int i=0; i<size; i++)
            {
        for(int j=0; j<size; j++)
            {
        for(int k=0; k<size; k++)
            {
                make_cube(i,j,k);
            }}}


        xPositionEntity(mesh,3,0,3);
        xEntityTexture(mesh,tex);
    }

void make_cube(int a, int b, int c){

            {
                int _x=0,_y=0,_z=1;
                if(diff(a,b,c,_x,_y,_z)==1)
                {
                            int v0 = xAddVertex(surf, a, b, c+1);
                            int v1 = xAddVertex(surf, a+1, b, c+1);
                            int v2 = xAddVertex(surf, a, b+1, c+1);
                            int v3 = xAddVertex(surf, a+1, b+1, c+1);

                                xVertexNormal(surf,v0,_x,_y,_z);
                                xVertexNormal(surf,v1,_x,_y,_z);
                                xVertexNormal(surf,v2,_x,_y,_z);
                                xVertexNormal(surf,v3,_x,_y,_z);

                                xVertexTexCoords(surf,v0,0,0);
                                xVertexTexCoords(surf,v1,1,0);
                                xVertexTexCoords(surf,v2,0,1);
                                xVertexTexCoords(surf,v3,1,1);

                            xAddTriangle(surf,v0,v1,v2);
                            xAddTriangle(surf,v3,v2,v1);
                }

                _x=0,_y=0,_z=-1;
                if(diff(a,b,c,_x,_y,_z)==1)
                {
                            int v0 = xAddVertex(surf, a, b, c);
                            int v1 = xAddVertex(surf, a+1, b, c);
                            int v2 = xAddVertex(surf, a, b+1, c);
                            int v3 = xAddVertex(surf, a+1, b+1, c);

                                xVertexNormal(surf,v0,_x,_y,_z);
                                xVertexNormal(surf,v1,_x,_y,_z);
                                xVertexNormal(surf,v2,_x,_y,_z);
                                xVertexNormal(surf,v3,_x,_y,_z);

                                xVertexTexCoords(surf,v0,0,0);
                                xVertexTexCoords(surf,v1,1,0);
                                xVertexTexCoords(surf,v2,0,1);
                                xVertexTexCoords(surf,v3,1,1);

                            xAddTriangle(surf,v0,v2,v1);
                            xAddTriangle(surf,v3,v1,v2);
                }

                _x=0,_y=1,_z=0;
                if(diff(a,b,c,_x,_y,_z)==1)
                {
                            int v0 = xAddVertex(surf, a, b+1, c);
                            int v1 = xAddVertex(surf, a+1, b+1, c);
                            int v2 = xAddVertex(surf, a, b+1, c+1);
                            int v3 = xAddVertex(surf, a+1, b+1, c+1);

                                xVertexNormal(surf,v0,_x,_y,_z);
                                xVertexNormal(surf,v1,_x,_y,_z);
                                xVertexNormal(surf,v2,_x,_y,_z);
                                xVertexNormal(surf,v3,_x,_y,_z);

                                xVertexTexCoords(surf,v0,0,0);
                                xVertexTexCoords(surf,v1,1,0);
                                xVertexTexCoords(surf,v2,0,1);
                                xVertexTexCoords(surf,v3,1,1);

                            xAddTriangle(surf,v0,v2,v1);
                            xAddTriangle(surf,v3,v1,v2);
                }

                _x=0,_y=-1,_z=0;
                if(diff(a,b,c,_x,_y,_z)==1)
                {
                            int v0 = xAddVertex(surf, a, b, c);
                            int v1 = xAddVertex(surf, a+1, b, c);
                            int v2 = xAddVertex(surf, a, b, c+1);
                            int v3 = xAddVertex(surf, a+1, b, c+1);

                                xVertexNormal(surf,v0,_x,_y,_z);
                                xVertexNormal(surf,v1,_x,_y,_z);
                                xVertexNormal(surf,v2,_x,_y,_z);
                                xVertexNormal(surf,v3,_x,_y,_z);

                                xVertexTexCoords(surf,v0,0,0);
                                xVertexTexCoords(surf,v1,1,0);
                                xVertexTexCoords(surf,v2,0,1);
                                xVertexTexCoords(surf,v3,1,1);

                            xAddTriangle(surf,v0,v1,v2);
                            xAddTriangle(surf,v3,v2,v1);
                }

                _x=1,_y=0,_z=0;
                if(diff(a,b,c,_x,_y,_z)==1)
                {
                            int v0 = xAddVertex(surf, a+1, b, c);
                            int v1 = xAddVertex(surf, a+1, b+1, c);
                            int v2 = xAddVertex(surf, a+1, b, c+1);
                            int v3 = xAddVertex(surf, a+1, b+1, c+1);

                                xVertexNormal(surf,v0,_x,_y,_z);
                                xVertexNormal(surf,v1,_x,_y,_z);
                                xVertexNormal(surf,v2,_x,_y,_z);
                                xVertexNormal(surf,v3,_x,_y,_z);

                                xVertexTexCoords(surf,v0,0,0);
                                xVertexTexCoords(surf,v1,1,0);
                                xVertexTexCoords(surf,v2,0,1);
                                xVertexTexCoords(surf,v3,1,1);

                            xAddTriangle(surf,v0,v1,v2);
                            xAddTriangle(surf,v3,v2,v1);
                }

                _x=-1,_y=0,_z=0;
                if(diff(a,b,c,_x,_y,_z)==1)
                {
                            int v0 = xAddVertex(surf, a, b, c);
                            int v1 = xAddVertex(surf, a, b+1, c);
                            int v2 = xAddVertex(surf, a, b, c+1);
                            int v3 = xAddVertex(surf, a, b+1, c+1);

                                xVertexNormal(surf,v0,_x,_y,_z);
                                xVertexNormal(surf,v1,_x,_y,_z);
                                xVertexNormal(surf,v2,_x,_y,_z);
                                xVertexNormal(surf,v3,_x,_y,_z);

                                xVertexTexCoords(surf,v0,0,0);
                                xVertexTexCoords(surf,v1,1,0);
                                xVertexTexCoords(surf,v2,0,1);
                                xVertexTexCoords(surf,v3,1,1);

                            xAddTriangle(surf,v0,v2,v1);
                            xAddTriangle(surf,v3,v1,v2);
                }
            }




    }

int diff (int i , int j , int k, int _x ,int _y, int _z)
    {
    //адрес ячейки , нормаль смещения
        int current_cell = test_data[i*size*size + j*size +k];
        int disp_cell = 0;
        if(current_cell!=0){

            int x = i+_x;
            int y = j+_y;
            int z = k+_z;


            if(x>=0 && y>=0 && z>=0){
            if(x<size && y<size && z<size){

                disp_cell = test_data[x*size*size + y*size +z];

            }}
        }
        return current_cell-disp_cell;
    }



};


moka 02.11.2012 02:31

Ответ: Странное.
 
А те трианглы что не видны (находятся между двумя кубами), они тоже добавлены? Или алгоритм учитывает и не добовляет их тем самым оптимизируя объём максимально?

Если да, то можно ещё сделать систему с учётом рядом стоящих чанков и также не рисовать не нужные трианглы.

Далее систему обновления сетки (динамично и оптимально).

И вуаля - у тебя есть свой рендер minecraft'а.

dsd 02.11.2012 03:09

Ответ: Странное.
 
для ячейки оно смотрит чтобы в ней был куб и если соседняя пустая то с той стороны добавляется грань. А еще для пущей экономии можно сделать так чтобы оно стоящие рядом грани которые находятся в одной плоскости рисовало не отдельными квадами а одним, но смысла пока не вижу. :-)Равно как и по краям экономить на квадах.

moka 02.11.2012 03:20

Ответ: Странное.
 
Ну сливать плоскости - весьма гемор, и слишком затратно думаю, с не очень то и большой экономией. При этом если будет повершинное освещение и текстуринг - то слишком запарка будет, тем более с разными тайлами.

dsd 02.11.2012 03:36

Ответ: Странное.
 
Вот и я того же мнения. А освещение мне кажется надо не по вершинам делать, а отдельной 3d текстурой. Потому что пересчитать для каждой вершины количество света и записать это в данные вершин и более трудоемко и ректально, чем из массива источников света для данного положения камеры нарисовать текстуру. тем более что в акслинксе эту текстуру можно очень легко и быстро сделать.

moka 02.11.2012 05:16

Ответ: Странное.
 
А по мне так можно попробовать совместить Deferred Rendering с тенями и SSAO, и будет достаточно.

Dzirt 03.11.2012 03:42

Ответ: Странное.
 
Название этой темы всегда поднимает мне настроение :)

dsd 09.11.2012 21:34

Ответ: Странное.
 
Сочинил класс который делает процесс создания поверхностей попроще.

Код:



struct vertex{

vec3 position;
vec3 normal;
vec2 texCoords;
vertex *parent;
vertex *child;
int index;
};

struct triangle{
int v0,v1,v2;
triangle *parent;
triangle *child;
int index;
};

class surf_fabric{

public:
    Engine * eng;
    Surface * surf;
    vertex * first_vert;
    vertex * last_vert;
    triangle * first_trian;
    triangle * last_trian;

    int vert_index;
    int trian_index;
    int vert_num;
    int trian_num;

surf_fabric(){
eng = Engine::Instance();
first_vert = new vertex;
last_vert = first_vert;
vert_index = 0;
first_trian = new triangle;
last_trian = first_trian;
trian_index = 0;
}


int AddVertex(vec3 position,vec3 normal,vec2 texCoords)
{
vertex * point = new vertex;
point->parent = last_vert;
last_vert->child = point;
point->position = position;
point->normal = normal;
point->texCoords = texCoords;
point->index = vert_index;
last_vert = point;
vert_index++;
return point->index;
}

int AddTriangle(int v0, int v1, int v2)
{
triangle * trian = new triangle;
trian->v0 = v0;
trian->v1 = v1;
trian->v2 = v2;
trian->index = trian_index;
trian_index++;
last_trian->child = trian;
trian->parent = last_trian;
last_trian = trian;
return trian->index;
}

Surface * BuildSurface(){

int count_vertices = last_vert->index;
int count_indices = 3*last_trian->index;

vertex * current_vert = first_vert;
triangle * current_trian = first_trian;
//создание поверхности
surf = eng->CreateSurface(count_vertices,count_indices);
surf->Lock();

while(current_vert!=last_vert){
//сначала ставлю вершины
current_vert = current_vert->child;
delete current_vert->parent;

        surf->SetVertexPosition(current_vert->index,current_vert->position);
        surf->SetVertexNormal(current_vert->index,current_vert->normal);
        surf->SetVertexTexCoord(current_vert->index,current_vert->texCoords);
}
delete last_vert;

while(current_trian!=last_trian){
//потом трианглы
current_trian = current_trian->child;
delete current_trian->parent;
surf->SetTriangle(current_trian->index,current_trian->v0,current_trian->v1,current_trian->v2);
}
delete last_trian;

surf->RecalcTangents();
surf->UnLock();

first_vert = new vertex;
last_vert = first_vert;
vert_index = 0;
first_trian = new triangle;
last_trian = first_trian;
trian_index = 0;

return surf;
}

};



теперь поверхность можно делать так:
Код:

        surf_fabric * surf = new surf_fabric();

        for(int i=0;i<100;i++){
            vec3 Position0(i+0,0,0) , Position1(i+0,0,1) , Position2(i+1,0,0) , Position3(i+1,0,1);
            vec3 Normal(0,1,0);
            vec2 texCoords(0,0);

            int v0 = surf->AddVertex(Position0,Normal,texCoords);
            int v1 = surf->AddVertex(Position1,Normal,texCoords);
            int v2 = surf->AddVertex(Position2,Normal,texCoords);
            int v3 = surf->AddVertex(Position3,Normal,texCoords);

            int t0 = surf->AddTriangle(v0,v1,v2);
            int t1 = surf->AddTriangle(v3,v2,v1);
        }

        Surface * surf0 = surf->BuildSurface();

        Entity *body0 = s->Add(surf0);
        StandartShaders::Render::OnlyNormals()->SetUniform(Shader::SU_LIGHTPOS,vec3(0,5,7));
        body0->SetShader(StandartShaders::Render::OnlyNormals());
        body0->SetPosition(0,0,0);

Может кому пригодится :)

dsd 24.11.2012 01:17

Ответ: Странное.
 
Вложений: 1
с помощью какой то матери и черной магии сделал тот же массив кубиков.

летать wasd и мышь, крутить кубик стрелки, закрыть альт+ф4
выяснилось что в
Код:

unsigned char* data = unsigned char[tex->GetDataSize()];
tex->GetData(data);
delete[] data;

tex->GetDataSize() у меня возвращает что угодно кроме нужного числа.


А можно как нибудь макросом текст вида:
Код:

uniform mat4 modelviewproj;                                               
uniform mat3 normalmatrix;                                             
uniform vec3 lightpos;                                                   
uniform mat4 model;                                                       

in vec3 position;                                                         
in vec3 normal;                                                           
in vec2 texcoord0;                                                       

out vec3 fragmentn;                                                       
out vec2 fragmentuv;                                                     
out vec3 lightvec;                                                       
out vec3 shadow;                                                         

void main(void) {                                                         
        gl_Position  = modelviewproj * vec4(position,1.0);                   
        fragmentn = normalmatrix * normal;                                     
        lightvec = lightpos - (model * vec4(position,1.0)).xyz;               
        fragmentuv = texcoord0;                                               
}

превратить в
Код:

"uniform mat4 modelviewproj;\n"
"uniform mat3 normalmatrix;\n"
"uniform vec3 lightpos;\n"
"uniform mat4 model;\n"

"in vec3 position;\n"
"in vec3 normal;\n"
"in vec2 texcoord0;\n"

"out vec3 fragmentn;\n"
"out vec2 fragmentuv;\n"
"out vec3 lightvec;\n"
"out vec3 shadow;\n"

"void main(void) {\n"
"        gl_Position  = modelviewproj * vec4(position,1.0);\n"
"        fragmentn = normalmatrix * normal;\n"
"        lightvec = lightpos - (model * vec4(position,1.0)).xyz;\n"
"        fragmentuv = texcoord0;\n"
"} \n"

И что надо заинклюдидь чтобы swprintf заработало?

И когда будет справка?

HolyDel 24.11.2012 02:35

Ответ: Странное.
 
Цитата:

tex->GetDataSize() у меня возвращает что угодно кроме нужного числа.
странно. может текстура сжата аппаратно?

Цитата:

А можно как нибудь макросом текст вида:
я не знаю способа. я добавляю файлы шейдеров прямо в проект и правлю их там.

Цитата:

И что надо заинклюдидь чтобы swprintf заработало?
<cstdio>

Цитата:

И когда будет справка?
в ближайшие месяцы - не будет.

демка показывает 1800 фпс, если выключить vsync в драйверах (на 680gt)

чтобы не обрезались кубы в ближней плоскости отсечения - теперь есть camera->SetDepthClamp(true);

dsd 24.11.2012 02:50

Ответ: Странное.
 
Цитата:

Сообщение от HolyDel (Сообщение 244655)
странно. может текстура сжата аппаратно?


я не знаю способа. я добавляю файлы шейдеров прямо в проект и правлю их там.


демка показывает 1800 фпс, если выключить vsync в драйверах (на 680gt)

обычный джпег, так что хз. Я просто ширину на высоту умножил и на 3 и получил нужный мне размер. после чего магические глюки прекратились.

ну значит можно будет приличный объем рисовать :) . в примере куб 32х32х32 и половина кубов примерно есть. то есть около 50 к треугольников. по идее в нормальном кубе 32х32х32 будет гораздо меньше полигонов, так как это нарисован худший вариант по количеству полигонов.


Часовой пояс GMT +4, время: 08:17.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot