Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> непонятное поведение сгенерированного ландшафта 
:(
    Опции темы
TRC
Дата 6.12.2013, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 27.10.2011

Репутация: нет
Всего: нет



я генерирую ландшафт используя карту высот - .raw файл сделанный фотошоп - и натягиваю на него текстуру - .tga файл. на ландшафт помещаются 4 объекта - баррак, 2 палатки и обломки вертолета. все это .obj модели скачанный с интернета с .mtl файлами материалов и .tga файлами текстур. 

проблема 1 - освещенность ландшафта. как её сделать? на картинке показан результат загрузки только ландшафта
user posted image
там все затемнено и ландшафт почти не виден. как его полностью осветить?


проблема 2 - когда я подгружаю другие объекты по непонятным причинам ландшафт получает текстуру вертолета 
user posted image
и странным образом освещается(если я поворачиваю камеру вправо то через некоторе время ландшафт исчезает - а другие объекты не исчезают)


в чем проблемы?

я использую freeglut а для загрузки объектов - самопальный загрузчик на основе примеров в нете.

вот так я инициализирую opengl

Код

glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(screenWidth, screenHeight);

    glutCreateWindow("LOADER");

    glewExperimental = true; 
    if (glewInit() != GLEW_OK) {
        fprintf(stderr, "Failed to initialize GLEW\n");
        return -1;
    }

    glViewport(0,0,screenWidth,screenHeight);
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity();

    gluPerspective(45.0f, (GLfloat)screenWidth/(GLfloat)screenHeight, 0.5f ,150.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    glutSetCursor(GLUT_CURSOR_NONE); 
    g_Camera.PositionCamera(0, 2, 3,   0, 0, 0,   0, 1, 0); 

    glDepthFunc(GL_LESS);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK); 
    glEnable(GL_DEPTH_TEST);
    
    
    GLfloat light_ambient[] = { 0.5, 0.5, 0.5, 1.0 };
    GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };

    glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    
    glEnable(GL_TEXTURE_2D);
    
    for(int i = 0; i < g_NOF; i++)
        models[i].load(titles[i]);

    landscape.Init();
    
    glutPassiveMotionFunc(MousePassive);
    glutIdleFunc(draw);
    glutDisplayFunc(draw);
    glutSpecialFunc(Keyboard);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
    


где models - массив объектов-моделей.
вот так выглядит метод draw
Код

void draw()
{
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    gluLookAt(g_Camera.m_vPosition.x, g_Camera.m_vPosition.y, g_Camera.m_vPosition.z,
          g_Camera.m_vView.x,     g_Camera.m_vView.y,     g_Camera.m_vView.z,
          g_Camera.m_vUpVector.x, g_Camera.m_vUpVector.y,g_Camera.m_vUpVector.z);
    
    //draw barrack
    glPushMatrix();
        glScalef(0.1, 0.1, 0.1);
        models[0].draw();
    glPopMatrix();

    //draw tent
    glPushMatrix();
        glScalef(0.1, 0.1, 0.1);
        glTranslatef(30, 0, 25);
        glRotatef(-90, 0, 1, 0);
        models[1].draw();
    glPopMatrix();
    
    //draw tent
    glPushMatrix();
        glScalef(0.1, 0.1, 0.1);
        glTranslatef(30, 0, 0);
        glRotatef(-90, 0, 1, 0);
        models[1].draw();
    glPopMatrix();
    
    //draw helicopter
    glPushMatrix();
        glScalef(0.11, 0.11, 0.11);
        glTranslatef(0, 0, 50);
        glRotatef(45, 0, 1, 0);
        models[2].draw();
    glPopMatrix();

    
    //draw landscape
    glPushMatrix();
        glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
        glTranslatef(-20, 0, 0);
        glScalef(0.01, 0.01, 0.01);
        glRotatef(90, 1, 0, 0);
        landscape.RenderLandscape();
    glPopMatrix();


    glutSwapBuffers();
}

Я думал использование glColorMaterial поможет - но ничего не произошло.

вот так выглядит метод draw() для объекта

Код

void draw()
{
    for(int g = 0; g < faces.size(); g++)
    {
        
        glMaterialfv(GL_FRONT, GL_SPECULAR, materials[g].Ks);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, materials[g].Kd);
        glMaterialfv(GL_FRONT, GL_AMBIENT, materials[g].Ka);
        glMaterialf(GL_FRONT, GL_SHININESS, materials[g].Ns);

        Texture t;
        getTexture(&t, materials[g].pict);

        glBindTexture(GL_TEXTURE_2D, t.texID);
        
        glBegin(GL_TRIANGLES);

        for(int f = 0; f < faces[g].size(); f++)
        {
            glNormal3f(normals[faces[g][f].vn1 - 1].x, normals[faces[g][f].vn1 - 1].y, normals[faces[g][f].vn1 - 1].z);
            glTexCoord2f(texCoords[faces[g][f].vt1 - 1].u, texCoords[faces[g][f].vt1 - 1].v);
            glVertex3f(vertices[faces[g][f].v1 - 1].x, vertices[faces[g][f].v1 - 1].y, vertices[faces[g][f].v1 - 1].z);

            glNormal3f(normals[faces[g][f].vn2 - 1].x, normals[faces[g][f].vn2 - 1].y, normals[faces[g][f].vn2 - 1].z);
            glTexCoord2f(texCoords[faces[g][f].vt2 - 1].u, texCoords[faces[g][f].vt2 - 1].v);
            glVertex3f(vertices[faces[g][f].v2 - 1].x, vertices[faces[g][f].v2 - 1].y, vertices[faces[g][f].v2 - 1].z);

            glNormal3f(normals[faces[g][f].vn3 - 1].x, normals[faces[g][f].vn3 - 1].y, normals[faces[g][f].vn3 - 1].z);
            glTexCoord2f(texCoords[faces[g][f].vt3 - 1].u, texCoords[faces[g][f].vt3 - 1].v);
            glVertex3f(vertices[faces[g][f].v3 - 1].x, vertices[faces[g][f].v3 - 1].y, vertices[faces[g][f].v3 - 1].z);
        }

        glEnd();
    }
}

все текстуры объектов были получены так
Код

textures.push_back(TextureObject());
    Texture loadtexture;
    if (LoadTGA(&loadtexture, texture_path)) 
    {
        strcpy(textures.back().pict, texture_path);

        glGenTextures(1, &loadtexture.texID);
        glBindTexture(GL_TEXTURE_2D, loadtexture.texID);
        glTexImage2D(GL_TEXTURE_2D, 
            0, 
            loadtexture.bpp / 8, 
            loadtexture.width, 
            loadtexture.height, 
            0, 
            loadtexture.type, 
            GL_UNSIGNED_BYTE, 
            loadtexture.imageData);
        
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        
        if (loadtexture.imageData) free(loadtexture.imageData);

        textures.back().t = loadtexture;

        return 0;
    }

текстуры ландшафта загружаются так
Код

LoadRawFile("landscape.Raw", MapSize * MapSize, &HeightMap[0][0]);

    Texture landscape;
    if (LoadTGA(&landscape, "landscape.tga")) {

        glGenTextures(1, &landscape.texID);
        glBindTexture(GL_TEXTURE_2D, landscape.texID);
        glTexImage2D(GL_TEXTURE_2D, 
            0, 
            landscape.bpp / 8, 
            landscape.width, 
            landscape.height, 
            0, 
            landscape.type, 
            GL_UNSIGNED_BYTE, 
            landscape.imageData);
        
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        
        if (landscape.imageData) free(landscape.imageData);
    } else  {
        cout<<"Cannot load texture"<<endl;
    }

    glEnableClientState(GL_VERTEX_ARRAY);            
    glVertexPointer (3, GL_FLOAT, 0, VertexMap);
    
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);    
    glTexCoordPointer(2, GL_FLOAT, 0, TextureMap);

    for (int Row=0; Row < MapSize*2; Row++)    
    {
        Indices[Row] = Row;
    }

а сам ландшафт рисуется так
Код


    int x, y, i, j;
    int Index = 0;
    
    for (i = 0; i < MapSize-1; i++)
    {
        Index = 0;
        for (j = 0;j < MapSize-1; j++)
        {    
            x = j * Zoom;
            y = i * Zoom;

            TextureMap[Index+0][0]= j * TextureBit;        
            TextureMap[Index+0][1]= i * TextureBit;
            TextureMap[Index+1][0]= j * TextureBit;
            TextureMap[Index+1][1]= (i+1) * TextureBit;

            VertexMap[Index+0][2] =    HeightMap[j][i];            
            VertexMap[Index+1][2] =    HeightMap[j][i+1];
            
            VertexMap[Index+0][0] = x;                
            VertexMap[Index+0][1] = y;
            VertexMap[Index+1][0] = x;
            VertexMap[Index+1][1] = y+Zoom;

            Index += 2;                
        }

        glDrawElements(GL_TRIANGLE_STRIP, Index, GL_UNSIGNED_INT, Indices);
    }


в чем проблема? почему ландшафт перехватывает текстуру вертолета? как осветить ландшафт?

Это сообщение отредактировал(а) TRC - 6.12.2013, 19:41
PM MAIL   Вверх
tzirechnoy
Дата 6.12.2013, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Цитата
в чем проблема? почему ландшафт перехватывает текстуру вертолета? 


Потому, что при рисовании ландшафта текущая текстура -- текстура вертолёта. Забыт glBindTexture(GL_TEXTURE_2D, landscape.texID);

Кстати: 1) Могли бы привести и компилируемый код. Вся эта загрузка -- не бог весть какой секрет, а кому-то можэт и помогло бы. Да и дажэ Вам.
2) При каждом draw() вызывается какой-то getTextures(), который непонятно что делает (и с некоторой вероятностью -- делает что-то не то).

Цитата
в чем проблема? почему ландшафт перехватывает текстуру вертолета? как осветить ландшафт?


Судя по тому, что при текстуре вертолёта ландшафт освещён замечательно -- думаю, дело в текстуре ландшафта. Например, она слишком тёмная. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0443 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.