LINUX.ORG.RU

Perl, OpenGL и GL_DEPTH_TEST

 ,


0

1

Вот код:

#!/usr/bin/perl

use OpenGL;

($width, $height) = (1280,800);

glpOpenWindow;
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LEQUAL);
glDepthRange(0, 1);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClearColor(0, 0, 0, 0);
glClearDepth(1);

$alpha = 0;
$beta = 0;

while (1) {
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	#glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

	glPushMatrix();
	glRotatef(90, 1, 0, 1);
	glRotatef($alpha, 0, 1, 0);
	glBegin(GL_QUADS);
		glColor3f(0, 0.6, 0);
		glVertex3f(-0.5, -0.5, -0.5);
		glVertex3f(0.5, -0.5, -0.5);
		glVertex3f(0.5, -0.5, 0.5);
		glVertex3f(-0.5, -0.5, 0.5);
	glEnd();
	glBegin(GL_TRIANGLES);
		glColor3f(0, 0.7, 0);
		glVertex3f(-0.5, -0.5, -0.5);
		glVertex3f(0, 0.5, 0);
		glVertex3f(0.5, -0.5, -0.5);

		glColor3f(1, 0.8, 0);
		glVertex3f(0.5, -0.5, -0.5);
		glVertex3f(0, 0.5, 0);
		glVertex3f(0.5, -0.5, 0.5);

		glColor3f(0, 0.9, 1);
		glVertex3f(0.5, -0.5, 0.5);
		glVertex3f(0, 0.5, 0);
		glVertex3f(-0.5, -0.5, 0.5);

		glColor3f(1, 1, 1);
		glVertex3f(-0.5, -0.5, 0.5);
		glVertex3f(0, 0.5, 0);
		glVertex3f(-0.5, -0.5, -0.5);
	glEnd();
	glPopMatrix();

	#glPushMatrix();
	#glRotatef(90, 1, 0, -1);
	#glRotatef($beta, 0, 1, 0);
	#glBegin(GL_TRIANGLES);
		#glColor3f(0.7, 0, 0);
		#glVertex3f(-0.5, -0.5, -0.5);
		#glVertex3f(0, 0.5, 0);
		#glVertex3f(0.5, -0.5, -0.5);

		#glColor3f(0.8, 0, 0);
		#glVertex3f(0.5, -0.5, -0.5);
		#glVertex3f(0, 0.5, 0);
		#glVertex3f(0.5, -0.5, 0.5);

		#glColor3f(0.9, 0, 0);
		#glVertex3f(0.5, -0.5, 0.5);
		#glVertex3f(0, 0.5, 0);
		#glVertex3f(-0.5, -0.5, 0.5);

		#glColor3f(1, 0, 0);
		#glVertex3f(-0.5, -0.5, 0.5);
		#glVertex3f(0, 0.5, 0);
		#glVertex3f(-0.5, -0.5, -0.5);
	#glEnd();
	#glPopMatrix();
	
	glpFlush();
	$alpha = $alpha + 0.5;
	$beta = $beta - 1;
}
glpMainLoop;

Неправильно работает тест глубины, вместо вращающейся пирамидки получается невесть что. Гугл не помог.

Картинка

где установка матрицы проекции.

Bad_ptr ★★★★ ()
Ответ на: комментарий от Kotolegokot

Ну да. И далее делаешь там установки всякие, а потом обратно в модел_вью_матрикс переключаешься и там уже рисуешь.
чё-то типа такого:

glMatrixMode(gl.PROJECTION)
glLoadIdentity()
//glOrtho(0, 800, 0, 600, -1.0, 1.0)
//токо тут не glOrtho, а glFrustum, от установок glFrusum будет многое зависеть.
//У тебя скорее всего просто не помещается твоя геометрия в поле видимости
glViewport(0,0, 800, 600)

gl.MatrixMode(gl.MODELVIEW)
gl.LoadIdentity()

Bad_ptr ★★★★ ()
Последнее исправление: Bad_ptr (всего исправлений: 3)
Ответ на: комментарий от Bad_ptr

а это ненадо в цикл засовывать:
перед циклом достаточно один раз вызвать
glClearColor(0, 0, 0, 0);
glClearDepth(1);

Bad_ptr ★★★★ ()
Ответ на: комментарий от Kotolegokot

Вот я твой код скопировал и добавил всё что я говорил. И у меня работает:

{
  use OpenGL;

  ($width, $height) = (1280,800);
  glpOpenWindow;

  glClearColor(0, 0, 0, 0);
  glClearDepth(1);
  glEnable(GL_CULL_FACE);
  glCullFace(GL_BACK);

  glEnable(GL_DEPTH_TEST);
  glDepthMask(GL_TRUE);
  glDepthFunc(GL_LEQUAL);
  glDepthRange(0, 1);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glFrustum(-1,1, -1,1, -1, 1);
  glViewport(0,0, $width, $height);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

  $alpha = 0;
  $beta = 0;

  while (1) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
    glRotatef(90, 1, 0, 1);
    glRotatef($alpha, 0, 1, 0);
    glBegin(GL_QUADS);
    glColor3f(0, 0.6, 0);
    glVertex3f(-0.5, -0.5, -0.5);
    glVertex3f(0.5, -0.5, -0.5);
    glVertex3f(0.5, -0.5, 0.5);
    glVertex3f(-0.5, -0.5, 0.5);
	glEnd();
	glBegin(GL_TRIANGLES);
    glColor3f(0, 0.7, 0);
    glVertex3f(-0.5, -0.5, -0.5);
    glVertex3f(0, 0.5, 0);
    glVertex3f(0.5, -0.5, -0.5);

    glColor3f(1, 0.8, 0);
    glVertex3f(0.5, -0.5, -0.5);
    glVertex3f(0, 0.5, 0);
    glVertex3f(0.5, -0.5, 0.5);

    glColor3f(0, 0.9, 1);
    glVertex3f(0.5, -0.5, 0.5);
    glVertex3f(0, 0.5, 0);
    glVertex3f(-0.5, -0.5, 0.5);

    glColor3f(1, 1, 1);
    glVertex3f(-0.5, -0.5, 0.5);
    glVertex3f(0, 0.5, 0);
    glVertex3f(-0.5, -0.5, -0.5);
    glEnd();
    glPopMatrix();

    glpFlush();
    $alpha = $alpha + 0.5;
    $beta = $beta - 1;
  }
  glpMainLoop;
}

Bad_ptr ★★★★ ()

[code]glDepthMask(GL_TRUE);

glDepthFunc(GL_LEQUAL); glDepthRange(0, 1);

......

glClearDepth(1);

вот это зачем? убери.

dikiy ★★☆☆☆ ()
Ответ на: комментарий от Kotolegokot

о б-же мой. Я не понимаю что там крутится на экране.
Короче читай какой-нибудь мануал по опенжлю и с такими вопросами на gamedev.ru

Bad_ptr ★★★★ ()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.