Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2015, 06:41   #1
koker_007
Пользователь
 
Аватар для koker_007
 
Регистрация: 30.03.2015
Сообщений: 35
Сообщение С++ openGL унылое пиксельное освещение.

В общем изучаю openGL по книге и приступил к освещению, однако у меня все освещение создается монолитно одним цветом по всей грани куба, а я хочу чтобы оно ложилось не равномерно, ну то есть если часть грани куба освещена лучше то та часть одной грани поярче, а у меня грани монолитно заливаются одним цветом.

Главный код (main.cpp)
Код HTML:
...
//параметры освещения
GLfloat light[] = { 0.3f, 0.3f, 0.3f, 1.0f };
GLfloat defuzeLight[] = { 0.9f, 0.9f, 0.9f, 1.0f };
GLfloat blic[] = {1.0f,1.0f,1.0f,1.0f};
//координаты размещения
GLfloat LIGHT_POSITION[] = {0.0f,0.0f,30.0f,0.0f};

//Создание главного окна
WINDOW W001;

//Функция рисования
void Draw(void){
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	//включаем проверку буфера глубины
	glEnable(GL_DEPTH_TEST);
	//включааем свет
	glEnable(GL_LIGHTING);
	//все нормали от поверхностей единичные
	glEnable(GL_NORMALIZE);
	//освещение цветовое
	glEnable(GL_COLOR_MATERIAL);

	glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);

	//добавление свету параметров
	glLightfv(GL_LIGHT0,GL_AMBIENT, light);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, light);
	glLightfv(GL_LIGHT0, GL_SPECULAR, light);
	//параметры бликового света
	glMaterialfv(GL_FRONT, GL_SPECULAR, blic);
	glMateriali(GL_FRONT, GL_SHININESS, 1);

	//включение и размещение
	glEnable(GL_LIGHT0);
	glLightfv(GL_LIGHT0, GL_POSITION, LIGHT_POSITION);

...


Грани куба (Kubic.cpp)
Код HTML:
#include <GL\glut.h>
struct Kubic
{
	void Kubic_inicualeze(float x,float y,float z,float size){
		GLfloat gray[] = { 0.75f, 0.75f, 0.75f, 1.0f };
		glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE,gray);
		glBegin(GL_QUADS);
		glColor3f(1.0f, 0.9f, 0.1f);

		glNormal3f(size*(x - 1), size*(y + 0), size*(z + 0));
		glVertex3d(size*(x + 0), size*(y + 1), size*(z + 0));
		glVertex3d(size*(x + 0), size*(y + 1), size*(z + 1));
		glVertex3d(size*(x + 0), size*(y + 0), size*(z + 1));
		glVertex3d(size*(x + 0), size*(y + 0), size*(z + 0));

		glNormal3f(size*(x + 2), size*(y + 0), size*(z + 0));
		glVertex3d(size*(x + 1), size*(y + 0), size*(z + 0));
		glVertex3d(size*(x + 1), size*(y + 0), size*(z + 1));
		glVertex3d(size*(x + 1), size*(y + 1), size*(z + 1));
		glVertex3d(size*(x + 1), size*(y + 1), size*(z + 0));

		glNormal3f(size*(x + 0), size*(y - 1), size*(z + 0));
		glVertex3d(size*(x + 0), size*(y + 0), size*(z + 0));
		glVertex3d(size*(x + 0), size*(y + 0), size*(z + 1));
		glVertex3d(size*(x + 1), size*(y + 0), size*(z + 1));
		glVertex3d(size*(x + 1), size*(y + 0), size*(z + 0));

		glNormal3f(size*(x + 0), size*(y + 2), size*(z + 0));
		glVertex3d(size*(x + 1), size*(y + 1), size*(z + 0));
		glVertex3d(size*(x + 1), size*(y + 1), size*(z + 1));
		glVertex3d(size*(x + 0), size*(y + 1), size*(z + 1));
		glVertex3d(size*(x + 0), size*(y + 1), size*(z + 0));

		//Низ
		glNormal3f(size*(x + 0), size*(y + 0), size*(z - 1));
		glVertex3d(size*(x + 1), size*(y + 0), size*(z + 0));
		glVertex3d(size*(x + 1), size*(y + 1), size*(z + 0));
		glVertex3d(size*(x + 0), size*(y + 1), size*(z + 0));
		glVertex3d(size*(x + 0), size*(y + 0), size*(z + 0));

		//Верх
		glNormal3f(size*(x + 0), size*(y + 0), size*(z + 2));
		glVertex3d(size*(x + 1), size*(y + 0), size*(z + 1));
		glVertex3d(size*(x + 1), size*(y + 1), size*(z + 1));
		glVertex3d(size*(x + 0), size*(y + 1), size*(z + 1));
		glVertex3d(size*(x + 0), size*(y + 0), size*(z + 1));


		glEnd();
	}
};
Все состоит из кубов, вроде бы все делал по книге, сделал нормали, и в целом освещение то появилось, все 3 типа освещения, но все эти 3 типа равномерно распределяются на одну грань. Что нужно сделать чтобы оно распределялось не равномерно?
Изображения
Тип файла: jpg 1 - копия - копия - копия.jpg (78.9 Кб, 148 просмотров)
ученик самоучка
koker_007 вне форума Ответить с цитированием
Старый 14.08.2015, 06:51   #2
koker_007
Пользователь
 
Аватар для koker_007
 
Регистрация: 30.03.2015
Сообщений: 35
По умолчанию

Блин извиняюсь снова пришел к ответу сам.

В общем надо было добавить больше нормалей на грань, каждой вершине своя нормаль.

Участок кода верхней грани
Код HTML:
		glNormal3f(size*(x + 1), size*(y + 0), size*(z + 2));
		glVertex3d(size*(x + 1), size*(y + 0), size*(z + 1));

		glNormal3f(size*(x + 1), size*(y + 1), size*(z + 2));
		glVertex3d(size*(x + 1), size*(y + 1), size*(z + 1));

		glNormal3f(size*(x + 0), size*(y + 1), size*(z + 2));
		glVertex3d(size*(x + 0), size*(y + 1), size*(z + 1));

		glNormal3f(size*(x + 0), size*(y + 0), size*(z + 2));
		glVertex3d(size*(x + 0), size*(y + 0), size*(z + 1));
Изображения
Тип файла: jpg 1 - копия - копия - копия - копия.jpg (81.2 Кб, 121 просмотров)
ученик самоучка

Последний раз редактировалось koker_007; 14.08.2015 в 09:24.
koker_007 вне форума Ответить с цитированием
Старый 14.08.2015, 07:26   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

для справки. вы изучаете устаревшую версию OpenGL.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.08.2015, 09:21   #4
koker_007
Пользователь
 
Аватар для koker_007
 
Регистрация: 30.03.2015
Сообщений: 35
Сообщение

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
для справки. вы изучаете устаревшую версию OpenGL.
А где я могу изучить новую? когда скачивал библиотеку она была версии 3.0.0
ученик самоучка
koker_007 вне форума Ответить с цитированием
Старый 14.08.2015, 10:00   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

библиотеку это для компилятора имеете в виду?
там просто связь с тем что есть у вас, сам OGL зависит от дров видео.
самое мощное обычно это брать GLEW/GLee для связки с библиотеками.

вы изучаете версию порядка второй.
начиная с третьей версии основной считаются шейдеры.
современная версия это четверка.

в смысле где? книги есть иные. правда на рус не знаю, уж извините.

и дело более не в том какая версия, а в том что glBegin/glEnd и иже с ними, это устаревшее.
ибо одна за вызов это мало, это неэффективно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.08.2015, 12:36   #6
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

koker_007, может вам пригодится эта статья по освещению на шейдерах.

Я по ней сделал два примера (вам пригодятся шейдеры - файлы с расширением .glsl):
- diffuse освещение куба с текстурами. Текстуры накладывал в 3D редакторе Blender, экспортировал в obj файл, импортировал в программу с помощью библиотеки Assimp
- diffuse+specular освещение сферы

Последний раз редактировалось 8Observer8; 20.08.2015 в 17:25.
8Observer8 вне форума Ответить с цитированием
Старый 20.08.2015, 15:04   #7
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Для изучения азов glBegin/glEnd самое то. Чуть позже попробуйте glCallList[s].
Понятно что развитие с тех пор не стояло на месте, но изучение лучше пройти с начала.
ResourceSpace вне форума Ответить с цитированием
Старый 20.08.2015, 17:13   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от ResourceSpace Посмотреть сообщение
Для изучения азов glBegin/glEnd самое то. Чуть позже попробуйте glCallList[s].
Понятно что развитие с тех пор не стояло на месте, но изучение лучше пройти с начала.
как раз таки нет, вы учите то что устарело и ни капли не помогает в изучении современного.
зачем?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.08.2015, 14:41   #9
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
Для изучения азов glBegin/glEnd самое то. Чуть позже попробуйте glCallList[s].
Понятно что развитие с тех пор не стояло на месте, но изучение лучше пройти с начала.
зачем учить то, что в реальном мире никто не использует?
только время понапрасну тратить.
f.hump вне форума Ответить с цитированием
Старый 29.08.2015, 14:59   #10
koker_007
Пользователь
 
Аватар для koker_007
 
Регистрация: 30.03.2015
Сообщений: 35
По умолчанию

Приобрел книгу "Open GL 4. Язык шейдеров. Книга рецептов" она по библиотеке GLSL.
Думал что там будет все подробно объясняться для новичков но изучая даже не понял как библиотеки GLSL поставить на Visual Studio.

Кто нибудь, дайте пожалуйста хорошие, подробные уроки по GLSL

В GLUT продвинулся до того что на скрине, но очень хочется изучать GLSL а не GLUT. В интернете уроков GLSL не очень много, а в книге что купил предполагается что навык работы с GLSL уже хоть какой-то но есть.

Разбираться в GLUT конечно интересно очень хочется в ногу с технологиями идти.

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
koker_007, может вам пригодится эта статья по освещению на шейдерах.

Я по ней сделал два примера (вам пригодятся шейдеры - файлы с расширением .glsl):
Сейчас посмотрю
Изображения
Тип файла: jpg 1 - копия - копия (3) - копия.jpg (71.7 Кб, 126 просмотров)
ученик самоучка

Последний раз редактировалось koker_007; 29.08.2015 в 15:10.
koker_007 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenGl. (Delphi). Освещение novicepro Помощь студентам 0 02.05.2012 21:03
Освещение в OpenGL _PROGRAMM_ Gamedev - cоздание игр: Unity, OpenGL, DirectX 18 29.12.2011 17:29
OpenGL - освещение Артэс Общие вопросы C/C++ 0 12.10.2011 20:46
как сделать такое освещение(opengl) ? NiCola999 Общие вопросы C/C++ 3 20.11.2010 15:02
OpenGL, освещение loozer Мультимедиа в Delphi 3 17.12.2008 19:09