游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3095|回复: 2

关于读取深度缓存的问题

[复制链接]

3

主题

7

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2006-8-10 20:09:00 | 显示全部楼层 |阅读模式
//在win32控制台方式下编写程序

//下面是绘制球体的代码
void display()
{
        //清空颜色缓存
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
       
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-5.0,5.0,-5.0,5.0,0.0,10.0);
       
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);

        //绘制坐标轴
        glColor3f(1.0,0.0,0.0);
        glBegin(GL_LINES);
                glVertex3f(0.0,0.0,0.0);
                glVertex3f(10.0,0.0,0.0);
                glVertex3f(0.0,0.0,0.0);
                glVertex3f(0.0,10.0,0.0);
                glVertex3f(0.0,0.0,0.0);
                glVertex3f(0.0,0.0,10.0);
        glEnd();

        //绘制球体
        glutSolidSphere(2.0,100,10);
       
        glutSwapBuffers();//交换缓存

}

//下面响应鼠标点击的函数
void mouse(int button,int state,int x,int y)
{
        float point[1];

        if(state == GLUT_DOWN)
        {
                glReadBuffer(GL_DEPTH);
                glReadPixels(x,y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,point);
                printf("%f\n",point[0]);
        }
}

//作用是将鼠标点击点对应的深度值从深度缓存中读取,然后显示这个值。当鼠标点击
//在球体上,这个值小于1.0,正常

//但是下面的情况就出现了问题
//当我不使用glut库中给定的物体,而是自己绘制一个物体时,取到的深度值总是1.0,
//也就是背景的深度值。我估计是我绘制的方法有问题。各位帮忙看看问题在什么地方
//下面是我绘制的物体的代码,这部分代码代替原先的glutSolidSphere(2.0,100,10);
//是一个正四面体
float points[4][3];
        //四顶点颜色分别是红色,绿色,蓝色,白色
        float colors[4][3] = {{1.0,0.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0,},{1.0,1.0,1.0}};
        int i;
       
        //设置四顶点的坐标
        for(i = 0; i < 3; i++)
        {
                points[0] = 3.0 * cos(i * 120.0 * PI / 180.0);
                points[2] = 3.0 * sin(i * 120.0 * PI / 180.0);
                points[1] = 0.0;
        }
       
        points[3][0] = points[3][2] = 0.0;
        points[3][1] = 3.0 * sqrt(2.0);
       
        //绘制正四面体
        glBegin(GL_POLYGON);
        //底面
        glColor3fv(colors[2]);
        glVertex3fv(points[0]);
        glVertex3fv(points[1]);
        glVertex3fv(points[2]);
        //侧面1
        //glColor3fv(colors[1]);
        glVertex3fv(points[0]);
        glVertex3fv(points[3]);
        glVertex3fv(points[1]);
        //侧面2
        //glColor3fv(colors[2]);
        glVertex3fv(points[1]);
        glVertex3fv(points[3]);
        glVertex3fv(points[2]);
        //侧面3
        //glColor3fv(colors[3]);
        glVertex3fv(points[2]);
        glVertex3fv(points[3]);
        glVertex3fv(points[0]);
        glEnd();


还望各位多多指点!

41

主题

184

帖子

184

积分

注册会员

Rank: 2

积分
184
发表于 2006-8-11 00:43:00 | 显示全部楼层

Re:关于读取深度缓存的问题

我试验过,代码没有问题,测试的结果也不为1

我把从写的代码放在下面,有问题再说,有几个地方注意一下,某些函数你可能理解有错误。

/*******************************************************************/
#include<iostream>
#include<cmath>
#include"windows.h"
#include"glew.h"
#include"glut.h"

#define PI 3.14

void MouseFunc(int button, int state, int x, int y)
{
        switch(state)
        {
                case GLUT_DOWN:
                        float point[1];
                        int viewport[4];
                        glGetIntegerv(GL_VIEWPORT, viewport);        //视口
                        y=viewport[3]-y;
                        printf("%i\n%i\n",x,y);

                        glReadPixels(        x,                                                //x坐标
                                                       y,                                                //y坐标
                                                1,1,                                        //读取一个像素
                                                       GL_DEPTH_COMPONENT,                //获得深度信息
                                                GL_FLOAT,                                //数据类型为浮点型
                                                       point);                                        //获得的深度值保存在winZ中
                        printf("%f\n",point[0]);
        }

}

//设置OpenGL环境参数
void SetupRC(void)
{
        //清空颜色缓存
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        glEnable(GL_DEPTH_TEST);       //  打开深度测试
}

void display()
{
float points[4][3];
//四顶点颜色分别是红色,绿色,蓝色,白色
float colors[4][3] = {{1.0,0.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0,},{1.0,1.0,1.0}};
int i;

//设置四顶点的坐标
for(i = 0; i < 3; i++)
{
        points[0] = 3.0 * cos(i * 120.0 * PI / 180.0);
        points[2] = 3.0 * sin(i * 120.0 * PI / 180.0);
        points[1] = 0.0;
        }

        points[3][0] = points[3][2] = 0.0;
        points[3][1] = 3.0 * sqrt(2.0);

        //绘制正四面体
        glBegin(GL_POLYGON);
        //底面
        glColor3fv(colors[2]);
        glVertex3fv(points[0]);
        glVertex3fv(points[1]);
        glVertex3fv(points[2]);
        //侧面1
        //glColor3fv(colors[1]);
        glVertex3fv(points[0]);
        glVertex3fv(points[3]);
        glVertex3fv(points[1]);
        //侧面2
        //glColor3fv(colors[2]);
        glVertex3fv(points[1]);
        glVertex3fv(points[3]);
        glVertex3fv(points[2]);
        //侧面3
        //glColor3fv(colors[3]);
        glVertex3fv(points[2]);
        glVertex3fv(points[3]);
        glVertex3fv(points[0]);
        glEnd();
}

//绘制场景
void RenderScene()
{
        display();
        glutSwapBuffers();
}

//初始化OpenGL
void Init()
{
        glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_ALPHA|GLUT_DEPTH);
        glutInitWindowSize(400,400);
        glutCreateWindow("gl参考实例");
        glutMouseFunc(MouseFunc);
        glutDisplayFunc(RenderScene);
        glClearColor(0.0f,0.0f,0.0f,0.0f);
        glClearDepth(1.0f);
        SetupRC();
}

void main()
{
        Init();
        glutMainLoop();
}

3

主题

7

帖子

19

积分

新手上路

Rank: 1

积分
19
 楼主| 发表于 2006-8-11 15:52:00 | 显示全部楼层

Re:关于读取深度缓存的问题

多谢指教,昨天我重新仔细地看书了,发现了问题所在。

关键的问题出在了对鼠标坐标的理解,opengl窗口的y坐标和屏幕的坐标是相反的,所以鼠标点的坐标(x,y)在代入函数glReadPixels(x,y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,point)使用时需要转换成opengl的窗口坐标,也就是把y改成height - y,其中height为窗口的高(viewport[3]即窗口高,先使用glGetIntegerv(GL_VIEWPORT,viewport)来获得
viewport[4]数组)。经测试正确。
再次谢谢楼上的兄台提示!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 02:29

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表