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)

dsd 11.08.2012 01:51

Ответ: Странное.
 
в общем вроде баг :) хотя может опять мне кажется :))

вот этот класс:

Код:



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 то приложение при запуске крэшится, хотя компилится без проблем.
плюс с назначением вторых текстурных координат какой-то странный косяк.

HolyDel 11.08.2012 09:51

Ответ: Странное.
 
Я сейчас в отпуске. Вернусь _ обязательно разберусь

dsd 12.08.2012 22:52

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

Прикола ради сделал плоскость на которую накладывается шум шейдером.
Плюс генерируется новый шум при перемещении камеры на 60 единиц от позиции плоскости. И кажется мне что примерно так террэйн делать и следует :)

Кстати, почему на текстурной координате = 0 читается значение из 1 и наоборот?
http://rghost.ru/land.zip

dsd 13.08.2012 19:35

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

Таки сделал бесшовную карту. Таки считает теперь само себе нормали и таки работает. И таки в сто раз проще по коду чем было бы в хорсе.:-D

при этом пиксельный шейдер фактически нетронут :) :
PHP код:

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;



HolyDel 13.08.2012 21:47

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

Кстати, почему на текстурной координате = 0 читается значение из 1 и наоборот?
хз. надо посмотреть.

Цитата:

Таки сделал бесшовную карту. Таки считает теперь само себе нормали и таки работает. И таки в сто раз проще по коду чем было бы в хорсе.
круто. уважаю.

pax 14.08.2012 11:09

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

Сообщение от dsd (Сообщение 236149)
Таки сделал бесшовную карту. Таки считает теперь само себе нормали и таки работает. И таки в сто раз проще по коду чем было бы в хорсе.:-D

Требует OpenCL.dll

dsd 14.08.2012 13:26

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

Сообщение от pax (Сообщение 236185)
Требует OpenCL.dll

Вроде как эта длл с драйверами видеокарты поставиться должна была:dontknow:

pax 14.08.2012 13:29

Ответ: Странное.
 
Вложений: 1
Черный экран. Встроеное видео в Core i5.

dsd 14.08.2012 13:31

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

Сообщение от pax (Сообщение 236194)
Черный экран. Встроеное видео в Core i5.

Это уже не ко мне :)) так то я с движком ничего особенного не делал :)

pax 14.08.2012 13:34

Ответ: Странное.
 
а почему демки/тесты для акселинкса в разделе ксорса кстати?

dsd 14.08.2012 13:37

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

Сообщение от pax (Сообщение 236198)
а почему демки/тесты для акселинкса в разделе ксорса кстати?

Лень новое название темы придумывать. Ну а так в разделе с++ наверно это быть должно.

HolyDel 14.08.2012 13:53

Ответ: Странное.
 
Требует OpenCL.dll

Странно. Последнем версии вроде должны были без зависимостей от опенсиэль
Возможно, сборка. Под. Мингв. Кривовата

dsd 14.08.2012 22:28

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


теперь под 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();

Зы: а где можно про тесселяцию пример посмотреть?

pax 14.08.2012 23:26

Ответ: Странное.
 
На GeForce 9600 GT идет хорошо. На краях террейна глюки запланированы?)

dsd 14.08.2012 23:45

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

Сообщение от pax (Сообщение 236277)
На GeForce 9600 GT идет хорошо.

ну оно на ноуте под 700 фпс дает, а ноут у меня не особо то резвый. плюс то что карту шума делает вообще без оптимизаций :)

Цитата:

Сообщение от pax (Сообщение 236277)
На краях террейна глюки запланированы?)

Неа, не запланированы. Это оно по краям читает противоположный край текстуры зачем то. но это лечится небольшим сжатием текстурных координат:
вместо 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);


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

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