|
Xors3D Графический движок с поддержкой DirectX9 |
11.08.2012, 01:51
|
#451
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
в общем вроде баг хотя может опять мне кажется )
вот этот класс:
class bug{
public:
Engine *eng;
Scene *s;
int segments;
Entity *body;
Surface *surf;
bug(Scene *sc){
eng = Engine::Instance();
s=sc;
segments=256;
surf=CreateSurface(segments);
body = s->Add(surf);
StandartShaders::Render::OnlyNormals()->SetUniform(Shader::SU_LIGHTPOS,vec3(0,5,7));
body->SetShader(StandartShaders::Render::OnlyNormals());
body->SetPosition(-2,-2,-6);
}
Surface* CreateSurface(int segments)
{
Engine *eng = Engine::Instance();
//считаю количество точек
int count_vertices = (segments+1)*(segments+1);
//считаю трианглы
int count_indices = 3*segments*segments;
//создание поверхности
Surface *surf = eng->CreateSurface(count_vertices,count_indices);
surf->Lock();
//ставлю точки куда следует
int index=0;
for(int i=0;i<=segments;i++){
for(int j=0;j<=segments;j++){
vec3 position(i-0.5*segments,0,j-0.5*segments);
vec3 normal(0,1,0);
surf->SetVertexPosition(index,position);
surf->SetVertexNormal(index,normal);
surf->SetVertexTexCoord(index,0.01+0.97*i/(float)segments,0.01+0.97*j/(float)segments,0);
index++;
}}
//ставлю полигоны
int trian_index=0;
for(int i=0;i<segments;i++){
for(int j=0;j<segments;j++){
//вычисляю для текущей клетки индексы точек в углах
int v0,v1,v2,v3;
//i - текущий ряд // j-текущий столбец
v0=i*(segments+1)+j;
v1=v0+1;
v2=v0+segments+1;
v3=v2+1;
surf->SetTriangle(trian_index,v0,v1,v2);
trian_index++;
surf->SetTriangle(trian_index,v1,v3,v2);
trian_index++;
}}
surf->RecalcTangents();
surf->UnLock();
return surf;
}
void Update(){
surf->Lock();
//ставлю точки куда следует
int index=0;
for(int i=0;i<=segments;i++){
for(int j=0;j<=segments;j++){
vec3 position(i-0.5*segments,0,j-0.5*segments);
vec3 normal(0,1,0);
surf->SetVertexPosition(index,position);
surf->SetVertexNormal(index,normal);
surf->SetVertexTexCoord(index,0.01+0.97*i/(float)segments,0.01+0.97*j/(float)segments,0);
index++;
}}
surf->UnLock();
}
};
создается там внутри поверхность.
потом вот этим методом делаю вид что переставил точки. вызываю его каждый кадр.
void Update(){
surf->Lock();
//ставлю точки куда следует
int index=0;
for(int i=0;i<=segments;i++){
for(int j=0;j<=segments;j++){
vec3 position(i-0.5*segments,0,j-0.5*segments);
vec3 normal(0,1,0);
surf->SetVertexPosition(index,position);
surf->SetVertexNormal(index,normal);
surf->SetVertexTexCoord(index,0.01+0.97*i/(float)segments,0.01+0.97*j/(float)segments,0);
index++;
}}
surf->UnLock();
}
В итоге оно сжирает всю память и падает. Как мне кажется это не есть хорошо.
Еще мои творения падают если текстуры назначать не по порядку.
в смысле если дать например на 0 слой любую, а потом на любой кроме 1 то приложение при запуске крэшится, хотя компилится без проблем.
плюс с назначением вторых текстурных координат какой-то странный косяк.
Последний раз редактировалось dsd, 14.11.2015 в 15:10.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.08.2012, 09:51
|
#452
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
Я сейчас в отпуске. Вернусь _ обязательно разберусь
|
(Offline)
|
|
12.08.2012, 22:52
|
#453
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Прикола ради сделал плоскость на которую накладывается шум шейдером.
Плюс генерируется новый шум при перемещении камеры на 60 единиц от позиции плоскости. И кажется мне что примерно так террэйн делать и следует
Кстати, почему на текстурной координате = 0 читается значение из 1 и наоборот?
http://rghost.ru/land.zip
|
(Offline)
|
|
13.08.2012, 19:35
|
#454
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Таки сделал бесшовную карту. Таки считает теперь само себе нормали и таки работает. И таки в сто раз проще по коду чем было бы в хорсе.
при этом пиксельный шейдер фактически нетронут :
uniform sampler2D texture0; in vec3 fragmentn; in vec2 fragmentuv; in vec3 lightvec; out vec4 color; void main(void) { float diff = dot(fragmentn,normalize(lightvec)); color = texture(texture0,fragmentuv)*diff; }
Последний раз редактировалось dsd, 14.11.2015 в 15:10.
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
|
|
13.08.2012, 21:47
|
#455
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
Кстати, почему на текстурной координате = 0 читается значение из 1 и наоборот?
|
хз. надо посмотреть.
Таки сделал бесшовную карту. Таки считает теперь само себе нормали и таки работает. И таки в сто раз проще по коду чем было бы в хорсе.
|
круто. уважаю.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.08.2012, 11:09
|
#456
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Странное.
Сообщение от dsd
Таки сделал бесшовную карту. Таки считает теперь само себе нормали и таки работает. И таки в сто раз проще по коду чем было бы в хорсе.
|
Требует OpenCL.dll
|
(Offline)
|
|
14.08.2012, 13:26
|
#457
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Сообщение от pax
Требует OpenCL.dll
|
Вроде как эта длл с драйверами видеокарты поставиться должна была
Последний раз редактировалось dsd, 14.11.2015 в 15:10.
|
(Offline)
|
|
14.08.2012, 13:29
|
#458
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Странное.
Черный экран. Встроеное видео в Core i5.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.08.2012, 13:31
|
#459
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Сообщение от pax
Черный экран. Встроеное видео в Core i5.
|
Это уже не ко мне ) так то я с движком ничего особенного не делал
|
(Offline)
|
|
14.08.2012, 13:34
|
#460
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Странное.
а почему демки/тесты для акселинкса в разделе ксорса кстати?
|
(Offline)
|
|
14.08.2012, 13:37
|
#461
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Сообщение от pax
а почему демки/тесты для акселинкса в разделе ксорса кстати?
|
Лень новое название темы придумывать. Ну а так в разделе с++ наверно это быть должно.
|
(Offline)
|
|
14.08.2012, 13:53
|
#462
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
Требует OpenCL.dll
Странно. Последнем версии вроде должны были без зависимостей от опенсиэль
Возможно, сборка. Под. Мингв. Кривовата
|
(Offline)
|
|
14.08.2012, 22:28
|
#463
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
теперь под 085 версией.
Немножко усложнил пиксельный шейдер.
теперь камера по поверхности террэйна ходит.
вроде поприкольней стало.
Только почему то вывод текста перестал работать.
ground->Update();
cam->Update();
c->Clear();
s->Render();
c->SetBlendMode(BM_ALPHA);
c->SetPosition(10,10);
c->Print(L"fps: %d",eng->GetStatistics()->GetFPS());
c->SetPosition(10,20);
c->Print(L"tris: %d",eng->GetStatistics()->TrisRendered());
c->SetPosition(10,45);
c->Print(L"wtf?: %f",ground->GetY_Land(10,10));
wnd->Flip();
Зы: а где можно про тесселяцию пример посмотреть?
Последний раз редактировалось dsd, 14.11.2015 в 15:10.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
|
|
14.08.2012, 23:26
|
#464
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Странное.
На GeForce 9600 GT идет хорошо. На краях террейна глюки запланированы?)
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.08.2012, 23:45
|
#465
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Сообщение от pax
На GeForce 9600 GT идет хорошо.
|
ну оно на ноуте под 700 фпс дает, а ноут у меня не особо то резвый. плюс то что карту шума делает вообще без оптимизаций
Сообщение от pax
На краях террейна глюки запланированы?)
|
Неа, не запланированы. Это оно по краям читает противоположный край текстуры зачем то. но это лечится небольшим сжатием текстурных координат:
вместо surf->SetVertexTexCoord(index,i/(float)segments,j/(float)segments,0);
вот так сделать и ок :
surf->SetVertexTexCoord(index,0.01f+0.98f*i/(float)segments,0.01f+0.98f*j/(float)segments,0);
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:09.
|