#include <windows.h>
#include <tchar.h>
#include <gl/glut.h>
#include <math.h>
#include "bmp_loader.cpp"
#include "material.h"
#include "classes.h"
const unsigned int MainSurface = 16;
const unsigned int Borders = 17;
MATERIAL MainSurfaceMaterial, BorderMaterial;
CUBE cube(0,0,0,1.5,"materials//stones.mpm");
void CreateBaseLists(float, float);
void Reshape(int w, int h)
{
if(h > 0) {
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0,w/(GLdouble)h,-20,0);
glMatrixMode(GL_MODELVIEW);
gluLookAt(0,1,-20,0,0,0,0,1,0);
}
}
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//glMatrixMode(GL_MODELVIEW);
//glLoadIdentity();
glTranslated(0,0,0);
glRotated(0.05, 0, 1, 0);
glCallList(MainSurface);
glCallList(Borders);
cube.Draw();
glFlush();
glutSwapBuffers();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_RGB );
glutInitDisplayMode( GLUT_DEPTH );
glutInitDisplayMode( GLUT_SINGLE );
glutInitWindowSize(800,600);
glutCreateWindow("Oil&Fire");
glutSetWindowTitle("Hello!");
glutDisplayFunc(Display);
glutIdleFunc(Display);
glutReshapeFunc(Reshape);
glClearColor(0.6,0,1,1);
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LEQUAL);
glEnable(GL_BLEND);
glEnable(GL_TEXTURE_2D);
glPolygonMode(GL_FRONT,GL_FILL);
glPolygonMode(GL_BACK,GL_LINE);
//glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
CreateBaseLists(11,0.5);
glutMainLoop();
return 0;
}
void CreateBaseLists(float falsedesk_w, float falsedesk_h)
{
MainSurfaceMaterial.LoadFile("materials//stones.mpm");
//Дисплейный список для поверхности "стола"
glNewList(MainSurface, GL_COMPILE);
glColor3d(1,1,1);
MainSurfaceMaterial.SetMaterial();
glBegin(GL_QUADS);
glTexCoord2d(0,0); glVertex3d(-5,0,-5);
glTexCoord2d(0,1); glVertex3d(-5,0,5);
glTexCoord2d(1,1); glVertex3d(5,0,5);
glTexCoord2d(1,0); glVertex3d(5,0,-5);
glEnd();
glEndList();
//Дисплейный список для бортиков
BorderMaterial.LoadFile("materials//borders.mpm");
glNewList(Borders, GL_COMPILE);
glColor3d(1,1,1);
BorderMaterial.SetMaterial();
glBegin(GL_QUADS);
/*glTexCoord2d(0,0); glVertex3d(-falsedesk_w/2, falsedesk_h, -falsedesk_w/2);
glTexCoord2d(1,0); glVertex3d(falsedesk_w/2, falsedesk_h, -falsedesk_w/2);
glTexCoord2d(1,1); glVertex3d(5, 0, -5);
glTexCoord2d(0,1); glVertex3d(-5, 0, -5);
*///первый бортик (нижний)
glTexCoord2d(0,0); glVertex3d(-falsedesk_w/2, falsedesk_h, falsedesk_w/2);
glTexCoord2d(1,0); glVertex3d(falsedesk_w/2, falsedesk_h, falsedesk_w/2);
glTexCoord2d(1,1); glVertex3d(5, 0, 5);
glTexCoord2d(0,1); glVertex3d(-5, 0, 5);
//второй бортик (верхний)
glTexCoord2d(0,0); glVertex3d(-falsedesk_w/2, falsedesk_h, -falsedesk_w/2);
glTexCoord2d(0,1); glVertex3d(-falsedesk_w/2, falsedesk_h, falsedesk_w/2);
glTexCoord2d(1,1); glVertex3d(-5, 0, 5);
glTexCoord2d(1,0); glVertex3d(-5, 0, -5);
//третий бортик (правый)
glTexCoord2d(0,0); glVertex3d(falsedesk_w/2, falsedesk_h, -falsedesk_w/2);
glTexCoord2d(1,0); glVertex3d(5, 0, -5);
glTexCoord2d(1,1); glVertex3d(5, 0, 5);
glTexCoord2d(0,1); glVertex3d(falsedesk_w/2, falsedesk_h, falsedesk_w/2);
//четвертый (левый)
glEnd();
glEndList();
}
Проблемы с Z-буффером в OpenGL
Т.к. проблема возникает не только на моем компе, подозреваю свою криворукость, но ошибку найти не могу.
Конкретнее: рисую поверхность с бортиками, затем кубик.
Но при этом кубик полностью перекрывает поверхность (хотя должен был бы быть виден лишь наполовину).
Вот код:
Код:
Рисование кубика:
Код:
void CUBE::Draw()
{
material.SetMaterial();
glColor4d(1,1,1,1.0);
glBegin(GL_QUADS);
glTexCoord2d(0,0); glVertex3d(x-size/2, y-size/2, z-size/2);
glTexCoord2d(1,0); glVertex3d(x-size/2, y+size/2, z-size/2);
glTexCoord2d(1,1); glVertex3d(x+size/2, y+size/2, z-size/2);
glTexCoord2d(0,1); glVertex3d(x+size/2, y-size/2, z-size/2);
//передняя грань
glTexCoord2d(0,0); glVertex3d(x+size/2, y-size/2, z-size/2);
glTexCoord2d(1,0); glVertex3d(x+size/2, y+size/2, z-size/2);
glTexCoord2d(1,1); glVertex3d(x+size/2, y+size/2, z+size/2);
glTexCoord2d(0,1); glVertex3d(x+size/2, y-size/2, z+size/2);
//правая боковая грань
glTexCoord2d(0,0); glVertex3d(x-size/2, y+size/2, z+size/2);
glTexCoord2d(1,0); glVertex3d(x-size/2, y+size/2, z-size/2);
glTexCoord2d(1,1); glVertex3d(x-size/2, y-size/2, z-size/2);
glTexCoord2d(0,1); glVertex3d(x-size/2, y-size/2, z+size/2);
//левая боковая грань
glTexCoord2d(0,0); glVertex3d(x-size/2, y-size/2, z+size/2);
glTexCoord2d(1,0); glVertex3d(x+size/2, y-size/2, z+size/2);
glTexCoord2d(1,1); glVertex3d(x+size/2, y+size/2, z+size/2);
glTexCoord2d(0,1); glVertex3d(x-size/2, y+size/2, z+size/2);
//задняя грань
glTexCoord2d(0,0); glVertex3d(x-size/2, y+size/2, z-size/2);
glTexCoord2d(1,0); glVertex3d(x-size/2, y+size/2, z+size/2);
glTexCoord2d(1,1); glVertex3d(x+size/2, y+size/2, z+size/2);
glTexCoord2d(0,1); glVertex3d(x+size/2, y+size/2, z-size/2);
//верхняя грань.
//Т.к. нижняя грань никогда не будет видна - нет смысла и рисовать ее (ис соображений оптимизации)
glEnd();
}
{
material.SetMaterial();
glColor4d(1,1,1,1.0);
glBegin(GL_QUADS);
glTexCoord2d(0,0); glVertex3d(x-size/2, y-size/2, z-size/2);
glTexCoord2d(1,0); glVertex3d(x-size/2, y+size/2, z-size/2);
glTexCoord2d(1,1); glVertex3d(x+size/2, y+size/2, z-size/2);
glTexCoord2d(0,1); glVertex3d(x+size/2, y-size/2, z-size/2);
//передняя грань
glTexCoord2d(0,0); glVertex3d(x+size/2, y-size/2, z-size/2);
glTexCoord2d(1,0); glVertex3d(x+size/2, y+size/2, z-size/2);
glTexCoord2d(1,1); glVertex3d(x+size/2, y+size/2, z+size/2);
glTexCoord2d(0,1); glVertex3d(x+size/2, y-size/2, z+size/2);
//правая боковая грань
glTexCoord2d(0,0); glVertex3d(x-size/2, y+size/2, z+size/2);
glTexCoord2d(1,0); glVertex3d(x-size/2, y+size/2, z-size/2);
glTexCoord2d(1,1); glVertex3d(x-size/2, y-size/2, z-size/2);
glTexCoord2d(0,1); glVertex3d(x-size/2, y-size/2, z+size/2);
//левая боковая грань
glTexCoord2d(0,0); glVertex3d(x-size/2, y-size/2, z+size/2);
glTexCoord2d(1,0); glVertex3d(x+size/2, y-size/2, z+size/2);
glTexCoord2d(1,1); glVertex3d(x+size/2, y+size/2, z+size/2);
glTexCoord2d(0,1); glVertex3d(x-size/2, y+size/2, z+size/2);
//задняя грань
glTexCoord2d(0,0); glVertex3d(x-size/2, y+size/2, z-size/2);
glTexCoord2d(1,0); glVertex3d(x-size/2, y+size/2, z+size/2);
glTexCoord2d(1,1); glVertex3d(x+size/2, y+size/2, z+size/2);
glTexCoord2d(0,1); glVertex3d(x+size/2, y+size/2, z-size/2);
//верхняя грань.
//Т.к. нижняя грань никогда не будет видна - нет смысла и рисовать ее (ис соображений оптимизации)
glEnd();
}
Очень прошу Вашего совета: что здесь нужно исправить и вообще - действительно ли это просто некорректная моя работа с z-буффером?
Прошу прощения, просто запутался в параметрах матрицы проекции. Все уже исправил. Тысячу извинений.