zoukankan      html  css  js  c++  java
  • openGL深度缓冲区问题

    http://zhidao.baidu.com/question/368299839.html&__bd_tkn__=6aa9196c746cd3357f1eec74aeb127b3950291e48078338d51fed8133ea5c69d362ad36bb4bcda3b39bb3949f6bbe47087ac3af56e60b1f4e7eb60157b5af530946ea1fb570f03de0125270dd437ba784d759374792fc88ea54d4375005c3b5bc4610f424abcdaaaef7efdaccbdc8d02c93122f54dad

    初始化函数   
    GL.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //设置清除颜色
    GL.glViewport(0, 0, this.Bounds.Width, this.Bounds.Height);
    GL.glMatrixMode(GL.GL_PROJECTION);
    GL.glLoadIdentity();
    GL.gluPerspective(90.0f, 1.0 * this.Width / this.Height, 0, 200);
    GL.glMatrixMode(GL.GL_MODELVIEW);
    GL.glLoadIdentity();
    GL.gluLookAt(0.0, 0.0,12.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //眼睛位置

    绘制函数

    GL.glEnable(GL.GL_DEPTH_TEST);
    GL.glDepthMask((Byte)GL.GL_TRUE);

    GL.glDepthFunc(GL.GL_LESS);

    double d1 = 8.6;
    double d2 =0.5;

    GL.glClear(GL.GL_COLOR_BUFFER_BIT|GL.GL_DEPTH_BUFFER_BIT);

    GL.glColor3d(1.0, 0.0, 0.0);
    GL.glutSolidSphere(0.6, 40, 32);

    GL.glTranslatef(0.0f, 0.0f, 5.0f);
    GL.glColor3d(0.0, 1.0, 0.0);
    GL.glutSolidSphere(1.0, 40, 32);

    我想用 绿球完全挡住红球,就是红球看不见。但是上面代码,绿球中间显示红球。不知为什么。
    我实在C#下用的openGL。我感觉好像是深度缓冲区的值没有变,或者两次绘制时深度缓冲区的值一样,但是我已经使用了 GL.glDepthMask((Byte)GL.GL_TRUE);

    我把 GL.glDepthFunc(GL.GL_LESS); 改成小于等于就可以覆盖掉红球
     
    举报| 2012-01-31 12:16 提问者采纳
     
    第一:GL.glDepthFunc(GL.GL_LESS); //opengl中这是默认值,不必多此一举

    第二:GL.gluPerspective(90.0f, 1.0 * this.Width / this.Height, 0, 200);
    这意味着:
    投影矩阵=
    0.75 0 0 0
    0 1 0 0
    0 0 1 0
    0 0 0 0 <--决定计算出来的w恒为0

    也就是说,世界坐标(x,y,z)->扩展4元(x,y,z,1)->视图坐标(x',y',z',1)(glLookat决定视图矩阵
    ), 最后转化成齐次坐标或者clip坐标(x'',y'',z'',w=0)
    判断重叠的点的深度。
    显然 z1''/w ==z2''/w (大小当然是int类型的最大值),两个值相同,且红球绘制在先,所 以绿球没办法遮挡红球。因为绿球深度总是=红球深度,在GL_LEST的情况下。

    当你改为GL_LEQUAL时,红球先绘制,绿球因为深度值等于红球的,就写入深度缓冲。红球对应的片断都会被剔除掉。自然就只有绿球了。

    3)所以正确的做法:
    gluPerspective()函数 中将near由0,改成1~6就可以了。
  • 相关阅读:
    Thinking in java(八)-正则表达式
    order by与索引
    order by与索引
    004_常量的设置
    008_ajax没有跳转页面的错误
    007_缺少aspactj依赖
    006_为什么我的本机地址是0.0.0.0.0.1
    005_mybatis逆向工程错误
    004_当用数据库账号密码不对时?
    059_SSM——JDK动态代理是怎么回事?它又是怎么运用到了SSM框架中的?
  • 原文地址:https://www.cnblogs.com/xuejinhui/p/4380997.html
Copyright © 2011-2022 走看看