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

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

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

Восстановить пароль
Повторная активизация e-mail

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

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

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

Ну тоесть чтобы передние грани не просвечивались, грани создавал по разному, и по часовой и против, никаких изменений это не вызвало.

Код openGL C++

Код HTML:
#include <windows.h>
#include <GL\glut.h>

#include "Kubic.cpp"

//Задание параметров главному окну
struct WINDOW{
	float wid = 200;
	float hei = 200;
};

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

//Функция рисования
void Draw(void){
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glBegin(GL_LINES);
	glColor3f(1.0, 1.0, 1.0);
	for (float i = -W001.wid / 2; i <= W001.wid / 2; i += 20){
		glVertex2f(i, W001.wid / 2);
		glVertex2f(i, -W001.wid / 2);
	}
	for (float i = -W001.hei / 2; i <= W001.hei / 2; i += 20){
		glVertex2f(W001.hei / 2, i);
		glVertex2f(-W001.hei / 2, i);
	}
	glEnd();

	//точка
	glPointSize(8);
	glBegin(GL_POINTS);
	glColor3f(1.0f, 0.5f, 0.1f);
	glVertex2f(50.0f,50.0f);
	glEnd();

	//Кубик
	Kubic I001;
	I001.Kubic_inicualeze(1, 2, 0, 20);
	I001.Kubic_inicualeze(2, -3, 0, 20);
	I001.Kubic_inicualeze(1, 2, 1, 20);
	I001.Kubic_inicualeze(0, 0, 5, 20);

	glutSwapBuffers();
}

void Timer(int){
	//1,0,0,1
	glRotatef(1.0f, 0.5f, 0.5f, 0.9f);
	//
	glutPostRedisplay();
	glutTimerFunc(30, Timer, 0);
}

void Initialize(){
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-W001.wid, W001.wid, -W001.hei / 2, W001.hei / 2, -400.0, 400.0);
	glMatrixMode(GL_MODELVIEW);
	
}

void ChangeSize(GLsizei w, GLsizei h){
	GLfloat aspectRatio;

	//Предотвращаем деление на нуль
	if (h == 0)
		h = 1;
	//Установка поля просмотра с размерами окна
	glViewport(0, 0, w, h);
	//Обновляет систему координат
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	aspectRatio = (GLfloat)w / (GLfloat)h;
	if (w <= h)
		glOrtho((-W001.wid / 2), (W001.wid / 2), ((-W001.hei / 2) / aspectRatio), ((W001.hei / 2) / aspectRatio), -400.0, 400.0);
	else
		glOrtho((-W001.wid / 2)*aspectRatio, (W001.wid / 2)*aspectRatio, (-W001.hei / 2), (W001.hei / 2), -400.0, 400.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

int main(int argc, char** argv){

	//инициализация
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB| GLUT_DEPTH);
	glutInitWindowSize((int)W001.wid*3, (int)W001.hei*2);
	glutInitWindowPosition(100, 200);
	glutCreateWindow("Koker-test004");
	//Регистрация
	glutDisplayFunc(Draw);
	glutTimerFunc(30, Timer, 0);

	//Функция вызывается при изменении размеров окна
	glutReshapeFunc(ChangeSize);
	Initialize();
	glutMainLoop();

	return 0;
}
Изображения
Тип файла: jpg Новый точечный рисунок.jpg (66.8 Кб, 118 просмотров)
ученик самоучка
koker_007 вне форума Ответить с цитированием
Старый 13.08.2015, 08:25   #2
koker_007
Пользователь
 
Аватар для koker_007
 
Регистрация: 30.03.2015
Сообщений: 35
Сообщение

Цитата:
Сообщение от koker_007 Посмотреть сообщение
Только начал изучать openGL и все никак не пойму как включить буфер глубины, скажите что и куда надо добавить в код чтобы грани квадрата отображались правильно и не заслонялись другими гранями.

Ну тоесть чтобы передние грани не просвечивались, грани создавал по разному, и по часовой и против, никаких изменений это не вызвало.

Код openGL C++

Код HTML:
#include <windows.h>
#include <GL\glut.h>

#include "Kubic.cpp"

//Задание параметров главному окну
struct WINDOW{
	float wid = 200;
	float hei = 200;
};

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

//Функция рисования
void Draw(void){
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glBegin(GL_LINES);
	glColor3f(1.0, 1.0, 1.0);
	for (float i = -W001.wid / 2; i <= W001.wid / 2; i += 20){
		glVertex2f(i, W001.wid / 2);
		glVertex2f(i, -W001.wid / 2);
	}
	for (float i = -W001.hei / 2; i <= W001.hei / 2; i += 20){
		glVertex2f(W001.hei / 2, i);
		glVertex2f(-W001.hei / 2, i);
	}
	glEnd();

	//точка
	glPointSize(8);
	glBegin(GL_POINTS);
	glColor3f(1.0f, 0.5f, 0.1f);
	glVertex2f(50.0f,50.0f);
	glEnd();

	//Кубик
	Kubic I001;
	I001.Kubic_inicualeze(1, 2, 0, 20);
	I001.Kubic_inicualeze(2, -3, 0, 20);
	I001.Kubic_inicualeze(1, 2, 1, 20);
	I001.Kubic_inicualeze(0, 0, 5, 20);

	glutSwapBuffers();
}

void Timer(int){
	//1,0,0,1
	glRotatef(1.0f, 0.5f, 0.5f, 0.9f);
	//
	glutPostRedisplay();
	glutTimerFunc(30, Timer, 0);
}

void Initialize(){
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-W001.wid, W001.wid, -W001.hei / 2, W001.hei / 2, -400.0, 400.0);
	glMatrixMode(GL_MODELVIEW);
	
}

void ChangeSize(GLsizei w, GLsizei h){
	GLfloat aspectRatio;

	//Предотвращаем деление на нуль
	if (h == 0)
		h = 1;
	//Установка поля просмотра с размерами окна
	glViewport(0, 0, w, h);
	//Обновляет систему координат
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	aspectRatio = (GLfloat)w / (GLfloat)h;
	if (w <= h)
		glOrtho((-W001.wid / 2), (W001.wid / 2), ((-W001.hei / 2) / aspectRatio), ((W001.hei / 2) / aspectRatio), -400.0, 400.0);
	else
		glOrtho((-W001.wid / 2)*aspectRatio, (W001.wid / 2)*aspectRatio, (-W001.hei / 2), (W001.hei / 2), -400.0, 400.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

int main(int argc, char** argv){

	//инициализация
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB| GLUT_DEPTH);
	glutInitWindowSize((int)W001.wid*3, (int)W001.hei*2);
	glutInitWindowPosition(100, 200);
	glutCreateWindow("Koker-test004");
	//Регистрация
	glutDisplayFunc(Draw);
	glutTimerFunc(30, Timer, 0);

	//Функция вызывается при изменении размеров окна
	glutReshapeFunc(ChangeSize);
	Initialize();
	glutMainLoop();

	return 0;
}
Все... справился.. надо было функцию
glEnable(GL_DEPTH_TEST);
вставить в функции рисования
glutDisplayFunc(Draw);

а я ее запихивал в код когда кубик вызывался.
ученик самоучка
koker_007 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обход дерева неизвестной глубины Человек_Борща Общие вопросы Delphi 6 04.07.2014 16:21
Чтение дерева неизвесной глубины из БД Человек_Борща БД в Delphi 4 03.06.2014 07:16
стек произвольной глубины tiger() Общие вопросы C/C++ 10 11.05.2011 13:47
OpenGl. Z буфер. (delphi) _PROGRAMM_ Помощь студентам 2 06.02.2011 21:25
расчет глубины погружения тела Hitman15 Помощь студентам 2 01.05.2010 21:00