Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Материалы в openGL / 5 сообщений из 5, страница 1 из 1
29.10.2013, 07:36
    #38444381
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Материалы в openGL
Всем привет.

Приступил к осваиванию C++, ну и решил сразу взять по крупному и написать игровой движок (ну или попытаться хотя бы)... Как бы двух зайцев :)

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

Сам код вот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
      void GLScene::display(){
        float col[] = {1.0, 0.0, 0.0, 1.0};
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        for(int i=0; i<GLScene::objects_num; i++){
          if (GLScene::objects[i][0].show){
            glPushMatrix();
            glMaterialfv(GL_FRONT, GL_SPECULAR, col);
            glMaterialf(GL_FRONT, GL_SHININESS, 1.0);
            //glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
            float gip = sqrt(pow(GLScene::objects[i][0].up.x, 2)
                            +pow(GLScene::objects[i][0].up.y, 2)
                            +pow(GLScene::objects[i][0].up.z, 2));
            glTranslatef(
              -GLScene::objects[i][0].position.x,
              -GLScene::objects[i][0].position.y,
              -GLScene::objects[i][0].position.z
            );
            glRotatef(-asin(GLScene::objects[i][0].up.x/gip)*180/3.14159, 0.0, 0.0, 1.0);
            glRotatef(-asin(GLScene::objects[i][0].up.z/gip)*180/3.14159, 1.0, 0.0, 0.0);
            if (GLScene::objects[i][0].angle>0.0){
            glRotatef(
              GLScene::objects[i][0].angle,
              0.0,
              1.0,
              0.0
            );
            }
            glVertexPointer(3, GL_FLOAT, 0, GLScene::objects[i][0].vertex);
            glDrawArrays(GL_TRIANGLES, 0, GLScene::objects[i][0].vertex_num);
            glPopMatrix();
          }
        };

        glFlush();
        glutSwapBuffers();
      }



То есть выбираю материал (непрозрачный, с красным отражением), произвожу разные смещения, повороты, потом рисую загруженные из файла объекты...

кстати, вот инициализация:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
      void GLScene::init(int* argc, char** argv, GLPoint left_bottom_near, GLPoint right_top_far){
        GLScene::objects_num = 0;
        GLScene::objects = new GLObject*[100000];

        GLScene::materials = new GLMaterial*[100000];

        glutInit(argc, argv);
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
        glutInitWindowSize(500,500);
        glutCreateWindow("simple");
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glFrustum(left_bottom_near.x, right_top_far.x, left_bottom_near.y, right_top_far.y, left_bottom_near.z, right_top_far.z);
        glutDisplayFunc(GLScene::display);
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnable(GL_LIGHTING);

        int position[3] = {3000, 0.0, 0.0};

        glEnable(GL_LIGHT0);
        //glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 0.9);
        glLightiv(GL_LIGHT0, GL_POSITION, position);
      }



то есть всё в режиме rgba, как и положено... Но при этом параметр прозрачности никак не учитывается и всё остаётся полупрозрачным. Что я не так написал или пропустил (просто пишу по статьям пока разбираюсь, может там чего забыли написать, или я недопонял)?
...
Рейтинг: 0 / 0
29.10.2013, 20:23
    #38445822
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Материалы в openGL
Ну что ж :) Сам и отвечу на свой вопрос... Вдруг кто с тем же столкнётся...

Дело было в том, что я забыл об одной единственной вещичке (в статьях, по которым я учусь её упустили)... Мне удалось вспомнить, что ранее я сталкивался с проблемой неправильной последовательности прорисовки граней. В общем тут было то же, просто эффект такой создавался, будто грани просвещаются... добавил glEnable(GL_DEPTH_TEST) и всё заработало как надо
...
Рейтинг: 0 / 0
30.10.2013, 01:26
    #38445995
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Материалы в openGL
Ну брат... это замечательно. Сам спросил. Сам ответил
...
Рейтинг: 0 / 0
30.10.2013, 22:55
    #38447537
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Материалы в openGL
maytonНу брат... это замечательно. Сам спросил. Сам ответил
А выбора то нету :) Если бы кто ответил хотя бы... а так... никто не отвечает, а научиться то хочется... вот и приходится самому разбираться по пол дня :)
...
Рейтинг: 0 / 0
31.10.2013, 01:49
    #38447641
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Материалы в openGL
Програмёрникто не отвечает, а научиться то хочется... вот и приходится самому разбираться по пол дня :)труъ вэй ))
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Материалы в openGL / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]