|
Xors3D Графический движок с поддержкой DirectX9 |
15.08.2012, 13:30
|
#466
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
Чтобы не брало с края текстуры - можно задать clamp фильтрацию у текстуры.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
02.11.2012, 01:59
|
#467
|
Мастер
Регистрация: 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;
}
};
|
(Offline)
|
|
02.11.2012, 02:31
|
#468
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Странное.
А те трианглы что не видны (находятся между двумя кубами), они тоже добавлены? Или алгоритм учитывает и не добовляет их тем самым оптимизируя объём максимально?
Если да, то можно ещё сделать систему с учётом рядом стоящих чанков и также не рисовать не нужные трианглы.
Далее систему обновления сетки (динамично и оптимально).
И вуаля - у тебя есть свой рендер minecraft'а.
|
(Offline)
|
|
02.11.2012, 03:09
|
#469
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
для ячейки оно смотрит чтобы в ней был куб и если соседняя пустая то с той стороны добавляется грань. А еще для пущей экономии можно сделать так чтобы оно стоящие рядом грани которые находятся в одной плоскости рисовало не отдельными квадами а одним, но смысла пока не вижу. Равно как и по краям экономить на квадах.
|
(Offline)
|
|
02.11.2012, 03:20
|
#470
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Странное.
Ну сливать плоскости - весьма гемор, и слишком затратно думаю, с не очень то и большой экономией. При этом если будет повершинное освещение и текстуринг - то слишком запарка будет, тем более с разными тайлами.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
02.11.2012, 03:36
|
#471
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Вот и я того же мнения. А освещение мне кажется надо не по вершинам делать, а отдельной 3d текстурой. Потому что пересчитать для каждой вершины количество света и записать это в данные вершин и более трудоемко и ректально, чем из массива источников света для данного положения камеры нарисовать текстуру. тем более что в акслинксе эту текстуру можно очень легко и быстро сделать.
|
(Offline)
|
|
02.11.2012, 05:16
|
#472
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Странное.
А по мне так можно попробовать совместить Deferred Rendering с тенями и SSAO, и будет достаточно.
|
(Offline)
|
|
03.11.2012, 03:42
|
#473
|
Элита
Регистрация: 16.01.2008
Сообщений: 1,800
Написано 958 полезных сообщений (для 3,833 пользователей)
|
Ответ: Странное.
Название этой темы всегда поднимает мне настроение
|
(Offline)
|
|
09.11.2012, 21:34
|
#474
|
Мастер
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
24.11.2012, 01:17
|
#475
|
Мастер
Регистрация: 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 заработало?
И когда будет справка?
Последний раз редактировалось dsd, 14.11.2015 в 15:10.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
24.11.2012, 02:35
|
#476
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
tex->GetDataSize() у меня возвращает что угодно кроме нужного числа.
|
странно. может текстура сжата аппаратно?
А можно как нибудь макросом текст вида:
|
я не знаю способа. я добавляю файлы шейдеров прямо в проект и правлю их там.
И что надо заинклюдидь чтобы swprintf заработало?
|
<cstdio>
в ближайшие месяцы - не будет.
демка показывает 1800 фпс, если выключить vsync в драйверах (на 680gt)
чтобы не обрезались кубы в ближней плоскости отсечения - теперь есть camera->SetDepthClamp(true);
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
24.11.2012, 02:50
|
#477
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Сообщение от HolyDel
странно. может текстура сжата аппаратно?
я не знаю способа. я добавляю файлы шейдеров прямо в проект и правлю их там.
демка показывает 1800 фпс, если выключить vsync в драйверах (на 680gt)
|
обычный джпег, так что хз. Я просто ширину на высоту умножил и на 3 и получил нужный мне размер. после чего магические глюки прекратились.
ну значит можно будет приличный объем рисовать . в примере куб 32х32х32 и половина кубов примерно есть. то есть около 50 к треугольников. по идее в нормальном кубе 32х32х32 будет гораздо меньше полигонов, так как это нарисован худший вариант по количеству полигонов.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:46.
|