1 / 1 / 0
Регистрация: 27.02.2010
Сообщений: 190
1

OpenGL, свет зависит от фона

14.10.2012, 22:45. Показов 1585. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Рисую сферы со светом в Opengl, поставил текстуру на фон. Проблема в том, что когда я ставлю темный фон на задний план, меняется и освещение сфер - они становятся более темными. Как это выключить?
C++
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
void CPicture::OnShowPicture() 
 {
 
 unsigned int textures[1];
 AUX_RGBImageRec *texture1=auxDIBImageLoadA("texturebmp1.bmp");
 glGenTextures(1, &textures[1]);
 glBindTexture(GL_TEXTURE_2D, textures[0]);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY,0, GL_RGB, GL_UNSIGNED_BYTE, texture1->data); 
 glEnable(GL_TEXTURE_2D);
 glBegin(GL_QUADS);
 glTexCoord2f(0.0, 0.0); glVertex2f(-1.0, -1.0);
 glTexCoord2f(0.0, 1.0); glVertex2f(-1.0, 1.0);
 glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0);
 glTexCoord2f(1.0, 0.0); glVertex2f(1.0, -1.0);
 glEnd();
 
 glPushMatrix(); 
 
 GLUquadricObj *quadObj;
 quadObj = gluNewQuadric(); // создаем новый Quadric объект
 
 // glClearColor(0, 0.5, 0.99, 1);
 
 float pos[4] = {-0.9f,-1.9f,0.9f,1};
 float dif[4] = {1,1,1,1};
 float am[4] = {0,0,0,1};
 glEnable(GL_LIGHTING
 );
 glEnable(GL_LIGHT1);
 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
 glEnable(GL_COLOR_MATERIAL);
 glLightfv(GL_LIGHT1, GL_POSITION, pos);
 glLightfv(GL_LIGHT1, GL_AMBIENT, am);
 glLightfv(GL_LIGHT1, GL_DIFFUSE, dif);
 gluQuadricDrawStyle(quadObj, GLU_FILL); // устанавливаем стиль: закрашенный
 
 //a = al*glcolor
 //d = dl*glcolor + a
 
 glColor3f(1,1,1);
 glTranslatef(-0.7, 0.2, 0); // Сдвиг
 gluSphere(quadObj, 0.15, 100, 10); // рисуем сферу
 
 glTranslatef(0, -0.3, 0); // Сдвиг
 gluSphere(quadObj, 0.22, 100, 10); // рисуем сферу
 
 glTranslatef(0, -0.4, 0); // Сдвиг
 gluSphere(quadObj, 0.3, 100, 10); // рисуем сферу
 
 
 
 glPopMatrix();
 
 glFinish(); //закончили с OpenGL
 SwapBuffers(wglGetCurrentDC()); //вывод рисунка в контекст
И еще одна проблема:
Если я напишу
C++
1
glColor3f(0,1,1);
Перед
C++
1
glPopMatrix();
Цвет всего бекграунда изменится. Не знаю почему так, как избавиться от этого?
Если кто-то поможет хоть с одной проблемой - буду очень благодарен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2012, 22:45
Ответы с готовыми решениями:

Свет в OpenGL
У меня отрисовывается шахматное поле черными и белыми квадратами (GL_QUADS). Также подгружаю модель...

Свет без спот лайтов OpenGL
http://img31.imageshack.us/img31/6276/dransik012.png ...

OpenGL C++: чтобы свет падал на сферу, а не на линии
Как сделать чтобы свет падал к примеру на сферу, а на линии не падал. Ибо линии меняют цвет. Может...

Как сделать картинку более реалистичной (свет в OpenGL)?
Что нужно добавить для реали стичного изображения? Код главной функцыи в txt

10
angstrom
14.10.2012, 23:37 2
Попробуй так
Delphi
1
2
3
4
5
6
7
...
  glPushAttrib(GL_ALL_ATTRIB_BITS);
  glColor3f(1,1,1);
  glTranslatef(-0.7, 0.2, 0); // Сдвиг
  gluSphere(quadObj, 0.15, 100, 10); // рисуем сферу
  glPopAttrib;
...
1 / 1 / 0
Регистрация: 27.02.2010
Сообщений: 190
14.10.2012, 23:49  [ТС] 3
Не помогло. Ладно уже с этим светом, но мне нужно еще рисовать дальше - а ничего не рисуется. После сфер. Я довольно таки много времени потратил, чтобы это разобрать, не хотелось бы чтобы все было зря(
Вот, если вам так удобнее будет. сам проект
http://ge.tt/16APmUP/v/0?c
0
Эксперт С++
4982 / 3089 / 456
Регистрация: 10.11.2010
Сообщений: 11,165
Записей в блоге: 10
15.10.2012, 02:28 4
Добавлено через 5 минут
Цитата Сообщение от bosscs Посмотреть сообщение
когда я ставлю темный фон на задний план
а где ты это делаешь и как?
0
angstrom
15.10.2012, 02:59 5
Посмотри
Вложения
Тип файла: rar sphere.rar (31.5 Кб, 12 просмотров)
1 / 1 / 0
Регистрация: 27.02.2010
Сообщений: 190
15.10.2012, 11:11  [ТС] 6
angstrom, совершенно не понял к чему твой пост и как он касается моей проблемы.

lazybiz, фон я ставлю в начале, там идет загрузка картинки
C++
1
AUX_RGBImageRec *texture1=auxDIBImageLoadA("texturebmp1.bmp");
и так далее.
Но это не основная проблема моя.
У меня не получается рисовать после того, как я нарисовал сферы и фон как бы становится другим цветом.
Вот так нормально должно быть:
http://imageshack.us/scaled/landing/43/123jwl.jpg

А вот так, если я после рисования сфер добавляю рисование линий:
C++
1
2
3
4
5
6
7
8
 glColor3f(1,0,0);
glBegin(GL_POINTS);
   glColor3d(1,0,0);
   glVertex3d(-4.5,4,0);
   glColor3d(0,1,0);
   glVertex3d(-4,4,0);
   glVertex3d(-3.5,4,0);
  glEnd();
Линии не рисуются и фон меняется:
http://imageshack.us/scaled/landing/856/1231hi.jpg
Пожалуйста, выручайте.
0
Эксперт С++
4982 / 3089 / 456
Регистрация: 10.11.2010
Сообщений: 11,165
Записей в блоге: 10
15.10.2012, 14:18 7
GL_POINTS - это рисование точек. Для того чтобы задать рисование линий используй GL_LINES, GL_LINE_STRIP или GL_LINE_LOOP.
Почему меняется цвет фона трудно понять. Было бы намного проще разобраться если бы ты показал весь код.
1
3244 / 1433 / 234
Регистрация: 26.02.2009
Сообщений: 7,459
Записей в блоге: 5
15.10.2012, 18:17 8
Долго работать не будет:
C++
1
quadObj = gluNewQuadric(); // создаем новый Quadric объект
Если есть создание, то должно быть удаление.
gluDeleteQuadric( quadObj );

C++
1
2
glGenTextures(1, &textures[1]);
glBindTexture(GL_TEXTURE_2D, textures[0]);
Я конечно в С++ мало разбираюсь, но по-моему генерация ID-текстуры идёт совсем не в ту ячейку которую используете. Хотя надо посмотреть приоритет операций... В любом случае эта запись наводи смуту.
glGenTextures(1, textures);

Цитата Сообщение от bosscs Посмотреть сообщение
Цвет всего бекграунда изменится.
Понятное дело. Цвет примитива, на который накладывается бэкграунд, становится последним установленным через glColor. А так как glTexEnv явно не задана. По дуфолту идёт умножение текстелей на цвета примитива.
Либо перед прорисовкой бэкграунда явно ставить glColor3f(1,1,1);
Либо наконец разобраться с окружением текстуры и поставить ей GL_REPALCE

Добавлено через 4 минуты

Не по теме:

Готовь сани в октябре )

1
1 / 1 / 0
Регистрация: 27.02.2010
Сообщений: 190
15.10.2012, 18:45  [ТС] 9
Решил вторую проблему. Еще раз спасибо.
0
3244 / 1433 / 234
Регистрация: 26.02.2009
Сообщений: 7,459
Записей в блоге: 5
15.10.2012, 18:50 10
Цитата Сообщение от bosscs Посмотреть сообщение
В чем может быть проблема?
Скорее всего они рисуются но за бэкграундом. Поэтому их не видно. Это если все остальные параметры в норме. Проверить можно отключив прорисовку бэкграунда.
нужно отключать запись в z-буфер для всяких там бэкграундов:
C++
1
2
3
4
glDepthMask( FALSE );
// рисуем бэкграунд
glDepthMask( TRUE );
// рисуем остальную сцену
1
Эксперт С++
4982 / 3089 / 456
Регистрация: 10.11.2010
Сообщений: 11,165
Записей в блоге: 10
15.10.2012, 18:52 11
glLineWidth( 2 );
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2012, 18:52
Помогаю со студенческими работами здесь

Opengl es: свет в сцене
Всем привет!! у меня на сцене есть источник света, но он светит не на всю сцену, а как сделать так...

Свет в OpenGL. Не выводится изображение на экран.
Пользуюсь модулем dglopengl.pas. Пытаюсь создать имитацию света, рисуя изображение, прикреплённое к...

Как прописать цвет фона который зависит от типа материала?
Всем привет. Столкнулся с проблемой: нужно сделать так, чтоб цвет фона материала на сайте менялся в...

Заливка фона openGL
кто работает с opengl. Не подскажите почему фон заливки всегда белый даже если указанный красный...

Установить пользовательский цвет фона в OpenGL
Здравствуйте, такой вопрос, возможно ли в OpenGL поставить изначально цвет фона другой или только 2...

OpenGL в VisualStudio2013 не работает заливка фона
Не работает заливка фона окна , всегда черный . Вот код: #include "stdafx.h" #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru