【问题标题】:OpenGL Depth Spaz AttackOpenGL 深度 Spaz 攻击
【发布时间】:2011-09-18 00:03:17
【问题描述】:

我今天开始学习 OpenGL,它简直太棒了。但是我不能一辈子根据深度绘制对象,而不是绘制顺序,所以我希望有人能告诉我我做错了什么。

这是我用来创建立方体的极其简单的代码:

 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();

 //Simple translation

 glBegin(GL_QUADS);     
  glColor3f(0.0f,1.0f,0.0f);    
  glVertex3f( 1.0f, 1.0f,-1.0f);    
  glVertex3f(-1.0f, 1.0f,-1.0f);    
  glVertex3f(-1.0f, 1.0f, 1.0f);    
  glVertex3f( 1.0f, 1.0f, 1.0f);    
  glColor3f(1.0f,0.5f,0.0f);    
  glVertex3f( 1.0f,-1.0f, 1.0f);    
  glVertex3f(-1.0f,-1.0f, 1.0f);    
  glVertex3f(-1.0f,-1.0f,-1.0f);    
  glVertex3f( 1.0f,-1.0f,-1.0f);    
  glColor3f(1.0f,0.0f,0.0f);    
  //You get the point, continue with all sides 
 glEnd();           // End Drawing The Cube

SDL_GL_SwapBuffers();

这是设置代码:

if (SDL_Init(SDL_INIT_EVERYTHING)<0)
    return -1;

SDL_GL_SetAttribute(SDL_GL_RED_SIZE,        8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,      8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,       8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE,      8);

SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,      16);
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE,        32);

SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE,    8);
SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE,    8);
SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE,    8);
SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE,    8);

SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS,  1);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES,  2);


SDL_Surface* screen = SDL_SetVideoMode(screen_x,screen_y,32,SDL_HWSURFACE|SDL_GL_DOUBLEBUFFER|SDL_OPENGL);

if (screen == NULL)
    return -2;

//glEnable(GL_DEPTH_TEST); //<-If this is uncommented look at figure 1
glDepthFunc(GL_LESS);

glClearColor(0, 0, 0, 0);
glClearDepth(1.0f);

glViewport(0, 0, screen_x, screen_y);

glMatrixMode(GL_PROJECTION); //projection with ortho, model otherwise
glLoadIdentity();

gluPerspective(60.0,1.0,0.0,10.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

好吧,当我

glEnable(GL_DEPTH_TEST);

...

如果我启用它

那么我应该做什么呢?我肯定错过了什么?如何解决我的深度问题?

【问题讨论】:

  • 如果你刚开始学习 OpenGL,你不应该学习立即模式。从最新版本的 OpenGL 来看,它很慢、很麻烦并且已被弃用,在 OpenGL-ES 中从未提供过。我推荐 Nicol Bolas 的教程,它们是目前最好的 arcsynthesis.org/gltut
  • 哇,非常感谢,这非常有帮助。当然,现在我正在阅读而不是编程,所以诅咒你,诅咒你鸭嘴兽 datenwolf。诅咒你。

标签: c++ opengl sdl


【解决方案1】:

我找到了答案!

http://www.opengl.org/resources/faq/technical/depthbuffer.htm

这是我找到答案的地方,我的近帧正好为 0,它需要稍微远离 0 才能使深度缓冲区的精度生效。 (如果我没看错的话) 一切都很好。

【讨论】:

  • 只需将其设置为 1.0。不要听世界声称你需要将它设置为 0.000001。
猜你喜欢
  • 1970-01-01
  • 2011-09-16
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 2015-10-12
  • 2014-07-18
相关资源
最近更新 更多