LINUX.ORG.RU

OpenGL. Ошибка проверки глубины.

 , ,


0

1

Здравствуйте, форумчане! Почему-то не проверяется глубина (z) в OpenGL! Делал по открывку кода в книге «OpenGL. Суперкнига, 3-е издание».

Вот основной файл.

#include <GL/glut.h>
#include <math.h>

#include <games_engine.h>




shapes shape;





void display() {
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	
	
	glColor3f(1, 0, 1);
	shape.circle(0, 75, 0, 50, 75, 32);
	
	glColor3f(0, 1, 1);
	shape.circle(0, 0, 0, 50, 0, 32);
	
	
	glRotatef(1, 1, 0, 0);
	
	
	glutSwapBuffers();
}



void timerFunc(int = 0) {
	display();
	
	
	glutTimerFunc(33, timerFunc, 0);
}



void changeSizeC(GLint w, GLint h) {
	if(h == 0)
		h = 1;
	
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	
	GLfloat aspectRatio = (GLfloat)w / (GLfloat)h;
	
	if(w <= h)
		glOrtho(-100, 100, -100 / aspectRatio, 100 / aspectRatio, -100, 100);
	else
		glOrtho(-100 * aspectRatio, 100 * aspectRatio, -100, 100, -100, 100);
	
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}



void firstSetupOGL() {
	glClearColor(0, 0, 0, 1);
	
	glColor3f(1, 1, 1);
	
	
	glShadeModel(GL_FLAT);
	glEnable(GL_DEPTH_TEST);
}




int main(int argc, char **argv) {
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
	glutInitWindowSize(400, 400);
	glutInitWindowPosition(400, 200);
	glutCreateWindow("Test");
	
	
	firstSetupOGL();
	glutReshapeFunc(changeSizeC);
	
	
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	
	
	timerFunc();
	
	
	glutMainLoop();
	
	
	
	return 0;
}

ChangeSizeC подстраивает изображение под размеры окна, была ещё ChangeSizeS, я её вырезал, так как она, в данном коде, не используется. Там только glOrtho от 0 до 100 было, а не от -100 до 100.

Файл «games_engine.h»:

class shapes {
	public:
		void circle(GLint xCenter, GLint yCenter, GLint zCenter, GLfloat widthCircle, GLfloat heightCircle, GLshort vertexs) {
			glBegin(GL_TRIANGLE_FAN);
				
				glVertex3f(xCenter, yCenter, zCenter);
				
				for(angle = 0; angle < (2 * GL_PI); angle += (GL_PI / vertexs)) {
					x = widthCircle * sin(angle);
					z = widthCircle * cos(angle);
					
					glVertex3f(x, yCenter - heightCircle, z);
				}
				
			glEnd();
		}
};

Google не помог (

Почему-то не проверяется глубина (z) в OpenGL

Враньё, всё в OpenGL проверяется, просто ты не осилил.

anonymous
()
Ответ на: комментарий от anonymous

Враньё, всё в OpenGL проверяется, просто ты не осилил.
anonymous (04.08.2013 17:06:43)

А сам осилил? Всё что-ли с первого раза получается? И в OpenGL по умолчанию НЕ проверяется глубина! http://www.fotolink.su/v.php?id=32053e8b04d056ff67f0c6c67bbd912d

Human-source
() автор топика
Ответ на: комментарий от x0r

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

Вот: http://www.fotolink.su/v.php?id=9975051ff2c5f773fefe01c96771f6f6

Синий круг всегда виден. Как написано в книге, проверка глубины устраняет этот эффект. На вид похоже, что поворачивется только на 180 градусов, и обратно, но как видно по коду, это не так, да и в книге это описавается как «эффект качки».

Human-source
() автор топика
Ответ на: комментарий от x0r

Для видеокарты стоят те, что выбрал Linux Mint, для OpenGL .h файлы с оф сайта и куча пакетов, список которых я нашёл на нескольких сайтов, всё было одно и то же (т.е. на половине сайтов было всё одно и то же).

Human-source
() автор топика
Ответ на: комментарий от anonymous

А включить дептх-тест умишка не хватило?
anonymous (05.08.2013 14:00:42)

А включить реад-тест в голове умишка не хватило? )))

void firstSetupOGL() {
glClearColor(0, 0, 0, 1);

glColor3f(1, 1, 1);


glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
}

Human-source
() автор топика
Ответ на: комментарий от anonymous

А в glDepthFunc что установлено?
anonymous (05.08.2013 20:40:40)

Первый раз слышу! А она зачем нужна? Ведь всё и без неё должно работать. Или я ошибаюсь?

Human-source
() автор топика
Ответ на: комментарий от Human-source

Устанавливает фунцию буфера глубины, каким образом будут тестироваться фрагменты. По умолчанию должна стоять GL_LEQUAL (рисуются фрагменты, у которых z/w меньше или равно), но лучше устанавливать значение явно. http://www.opengl.org/sdk/docs/man/xhtml/glDepthFunc.xml

anonymous
()
Ответ на: комментарий от anonymous

anonymous, спасибо, буду изучать!

ЗЫ: В книге про это не сказано, скорее всего из-за того, что последняя русская версия вышла в 2006 году (3-е издание), 4-ое ещё не перевили, а с английским у меня не очень хорошо.

Human-source
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.