Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Xors3D

Xors3D Графический движок с поддержкой DirectX9

Ответ
 
Опции темы
Старый 15.08.2012, 13:30   #466
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Странное.

Чтобы не брало с края текстуры - можно задать clamp фильтрацию у текстуры.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (15.08.2012)
Старый 02.11.2012, 01:59   #467
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

зачем то сделал класс который трехмерный массив из 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;
    }



};
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.jpg
Просмотров: 851
Размер:	130.2 Кб
ID:	17969  
(Offline)
 
Ответить с цитированием
Старый 02.11.2012, 02:31   #468
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Странное.

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

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

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

И вуаля - у тебя есть свой рендер minecraft'а.
(Offline)
 
Ответить с цитированием
Старый 02.11.2012, 03:09   #469
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

для ячейки оно смотрит чтобы в ней был куб и если соседняя пустая то с той стороны добавляется грань. А еще для пущей экономии можно сделать так чтобы оно стоящие рядом грани которые находятся в одной плоскости рисовало не отдельными квадами а одним, но смысла пока не вижу. Равно как и по краям экономить на квадах.
(Offline)
 
Ответить с цитированием
Старый 02.11.2012, 03:20   #470
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Странное.

Ну сливать плоскости - весьма гемор, и слишком затратно думаю, с не очень то и большой экономией. При этом если будет повершинное освещение и текстуринг - то слишком запарка будет, тем более с разными тайлами.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (02.11.2012)
Старый 02.11.2012, 03:36   #471
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

Вот и я того же мнения. А освещение мне кажется надо не по вершинам делать, а отдельной 3d текстурой. Потому что пересчитать для каждой вершины количество света и записать это в данные вершин и более трудоемко и ректально, чем из массива источников света для данного положения камеры нарисовать текстуру. тем более что в акслинксе эту текстуру можно очень легко и быстро сделать.
(Offline)
 
Ответить с цитированием
Старый 02.11.2012, 05:16   #472
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Странное.

А по мне так можно попробовать совместить Deferred Rendering с тенями и SSAO, и будет достаточно.
(Offline)
 
Ответить с цитированием
Старый 03.11.2012, 03:42   #473
Dzirt
Элита
 
Аватар для Dzirt
 
Регистрация: 16.01.2008
Сообщений: 1,800
Написано 958 полезных сообщений
(для 3,833 пользователей)
Ответ: Странное.

Название этой темы всегда поднимает мне настроение
(Offline)
 
Ответить с цитированием
Старый 09.11.2012, 21:34   #474
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

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


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);
Может кому пригодится
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (09.11.2012)
Старый 24.11.2012, 01:17   #475
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

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

летать 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 заработало?

И когда будет справка?
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.jpg
Просмотров: 1126
Размер:	69.3 Кб
ID:	18112  

Последний раз редактировалось dsd, 14.11.2015 в 15:10.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (24.11.2012)
Старый 24.11.2012, 02:35   #476
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Странное.

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

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

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

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

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

чтобы не обрезались кубы в ближней плоскости отсечения - теперь есть camera->SetDepthClamp(true);
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (24.11.2012)
Старый 24.11.2012, 02:50   #477
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

Сообщение от HolyDel Посмотреть сообщение
странно. может текстура сжата аппаратно?


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


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

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


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com