查看: 2329|回复: 6

问个opengl的问题

[复制链接]

该用户从未签到

发表于 2012-10-3 12:17:25 | 显示全部楼层 |阅读模式
本帖最后由 xiacanni 于 2012-10-3 13:13 编辑

最近刚开始学osg和opengl,没找到合适的地方问opengl的问题,就在这里问一下吧。(这里的opengl区好像没什么人)

在程序中加入glEnable(GL_DEPTH_TEST)之后显示就完全黑屏了,即使是清空了深度缓冲glClear(GL_DEPTH_BUFFER_BIT),也没用。
但是加上glDepthFunc(GL_LEQUAL)之后就能显示了,而如果加上的事glDepthFunc(GL_LESS)、或者都不加也不能正确显示(还是黑屏)。
程序如下:(我正在根据http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html这个教程学习opengl,这个程序是里面的一个例子。)

#include "glut.h"
// 太阳、地球和月亮
// 假设每个月都是30天
// 一年12个月,共是360天
static int day = 70; // day的变化:从0到359
void myDisplay(void)
{
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDepthFunc(GL_LEQUAL);  // 设置深度缓存


glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(75, 1, 1, 400000000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, -200000000, 200000000, 0, 0, 0, 0, 0, 1);

// 绘制红色的“太阳”
glColor3f(1.0f, 0.0f, 0.0f);
glutSolidSphere(69600000, 20, 20);
// 绘制蓝色的“地球”
glColor3f(0.0f, 0.0f, 1.0f);
glRotatef(day/360.0*360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(150000000, 0.0f, 0.0f);
glutSolidSphere(15945000, 20, 20);
// 绘制黄色的“月亮”
glColor3f(1.0f, 1.0f, 0.0f);
glRotatef(day/30.0*360.0 - day/360.0*360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(38000000, 0.0f, 0.0f);
glutSolidSphere(4345000, 20, 20);

glFlush();
}
int main(int argc, char *argv[])

{
glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

glutInitWindowPosition(300, 200);

glutInitWindowSize(400, 400);

glutCreateWindow("第一个OpenGL程序");

glutDisplayFunc(&myDisplay);

glutMainLoop();

return 0;

}

补充:又试验了下,加入glDepthFunc(GL_LEQUAL)后虽然能显示,但是深度缓冲没起作用,依然是后绘制的覆盖了先绘制的,而不是根据深度来显示。  在不加入glDepthFunc(GL_LEQUAL)时,通过改变day的值,改变月亮的位置,有时最后绘制的那个月亮能显示出来。

该用户从未签到

发表于 2012-10-3 14:33:04 | 显示全部楼层
glutInitDisplayMode(xxx | GLUT_DEPTH);

该用户从未签到

发表于 2012-10-8 10:14:09 | 显示全部楼层
您这里给出的数值非常大了,您设置的远近平面也超出了OpenGL深度缓冲区的精度范围,这些都是很大的问题。教程区我翻译的《恋上Z缓存》就是讲解这一现象的

该用户从未签到

 楼主| 发表于 2012-10-8 15:23:56 | 显示全部楼层
array 发表于 2012-10-8 10:14
您这里给出的数值非常大了,您设置的远近平面也超出了OpenGL深度缓冲区的精度范围,这些都是很大的问题。教 ...

谢谢!
把这个gluPerspective(75, 1, 1, 400000000)改成gluPerspective(75, 1, 1000, 400000000)后可以显示了。
我马上去看看那个 恋上深度缓存。
刚开始学opengl和osg,以前没接触过类似的,慢慢努力吧!

该用户从未签到

 楼主| 发表于 2012-10-8 22:11:26 | 显示全部楼层
array 发表于 2012-10-8 10:14
您这里给出的数值非常大了,您设置的远近平面也超出了OpenGL深度缓冲区的精度范围,这些都是很大的问题。教 ...

如何查看深度缓存的精度是16bit、24bit还是32bit啊?

该用户从未签到

发表于 2012-10-9 08:19:05 | 显示全部楼层
glGetIntegerv GL_DEPTH_BITS

该用户从未签到

 楼主| 发表于 2012-10-10 10:45:52 | 显示全部楼层
liuzhiyu123 发表于 2012-10-9 08:19
glGetIntegerv GL_DEPTH_BITS

Thank you
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表