Новичок
Профиль
Группа: Участник
Сообщений: 4
Регистрация: 27.10.2011
Репутация: нет Всего: нет
|
я генерирую ландшафт используя карту высот - .raw файл сделанный фотошоп - и натягиваю на него текстуру - .tga файл. на ландшафт помещаются 4 объекта - баррак, 2 палатки и обломки вертолета. все это .obj модели скачанный с интернета с .mtl файлами материалов и .tga файлами текстур. проблема 1 - освещенность ландшафта. как её сделать? на картинке показан результат загрузки только ландшафта  там все затемнено и ландшафт почти не виден. как его полностью осветить? проблема 2 - когда я подгружаю другие объекты по непонятным причинам ландшафт получает текстуру вертолета  и странным образом освещается(если я поворачиваю камеру вправо то через некоторе время ландшафт исчезает - а другие объекты не исчезают) в чем проблемы? я использую 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
|