游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5707|回复: 9

有谁做过太阳光晕即(lens flare)请求帮忙

[复制链接]

1

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2005-5-27 16:11:00 | 显示全部楼层 |阅读模式
有谁做过场景漫游中的太阳光晕,帮帮忙!谢谢
我做的时候是用gluProject函数把光源的位置转换为屏幕的坐标p,然后计算屏幕中心坐标c,
然后以pc为直线画太阳,光圈等等.在画的时候,还用了新的投影
代码如下:
        float lx,ly;//中心眩光环到屏幕中心的距离
        int x,y;//一个眩光环的位置。
        int cx,cy;//屏幕的中心点
        int i;
        float z;
        GLdouble mProj[16];
        GLdouble mView[16];
        GLint mPort[4];
        GLdouble wx,wy,wz;
    glPoint m_LightSourcePos;
        glGetDoublev(GL_PROJECTION_MATRIX,mProj);
        glGetDoublev(GL_MODELVIEW_MATRIX,mView);
        glGetIntegerv(GL_VIEWPORT,mPort);

    gluProject(m_LightSourcePos.x,m_LightSourcePos.y,m_LightSourcePos.z,
                       mView,mProj,mPort,
               &wx,&wy,&wz);
        if(wx<mPort[0] || wx>mPort[2])return;
        if(wy<mPort[1] || wy>mPort[3])return;

        //检测 眩光的中心点是不是被 东西档住了,加上这两行就可以防止太阳光穿过山
        glReadPixels(wx,wy,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&z);
    if(z < wz && z !=1.0 )return;
        if(wz<0) return ;
//        Console.Log("lens z-bufer: %f, project z: %f",z,wz);
        //设置眩光体屏幕上的位置和 屏幕的中心位置
        cx = mPort[2]/2.;
        cy = mPort[3]/2.;
               lx = cx-wx ;
        ly = cx-wy ;
        //准备好新的2D平面投影矩阵
        glPushAttrib(GL_ENABLE_BIT);
        glMatrixMode(GL_PROJECTION);
        glPushMatrix();
        glLoadIdentity();
        glOrtho(0,mPort[2],0,mPort[3],-100,100);
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();
        glLoadIdentity();
        glEnable(GL_TEXTURE_2D);
//关闭雾,和深度检测
   glDisable(GL_FOG);
        glDisable(GL_DEPTH_TEST);
        glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_COLOR,GL_ONE);
//画主眩光部分   
        float a =atan(lx/ly)*180/3.14;
        glColor3f(1.0,.6,0.1);
        for(i=0;i<m_MainNodes.size();i++)
        {
                glTranslated(wx,wy,0);
                glRotated(-(i+4)/4.*a,0,0,1);
                glTranslated(-wx,-wy,0);
                glBindTexture(GL_TEXTURE_2D,m_MainNodes.texID);  
        glBegin(GL_QUADS);
                   glTexCoord2f(0,0);
                        glVertex3f(wx - m_MainNodes.size,wy - m_MainNodes.size,-10);
           glTexCoord2f(1,0);
                        glVertex3f(wx + m_MainNodes.size,wy - m_MainNodes.size,-10);
           glTexCoord2f(1,1);
                        glVertex3f(wx + m_MainNodes.size,wy + m_MainNodes.size,-10);
                   glTexCoord2f(0,1);       
                        glVertex3f(wx - m_MainNodes.size,wy + m_MainNodes.size,-10);
                glEnd();
        }
        glLoadIdentity();

//画次级眩光部分
        for(i=0;i<m_SubNodes.size();i++)
        {
        x = wx + lx * m_SubNodes.pos;
        y = wy + ly * m_SubNodes.pos;
                glBindTexture(GL_TEXTURE_2D,m_SubNodes.texID);  
        glBegin(GL_QUADS);
                   glTexCoord2f(0,0);
                   glVertex3f(x - m_SubNodes.size , y - m_SubNodes.size ,-10);
           glTexCoord2f(1,0);
                   glVertex3f(x + m_SubNodes.size , y - m_SubNodes.size ,-10);
           glTexCoord2f(1,1);
                   glVertex3f(x + m_SubNodes.size , y + m_SubNodes.size ,-10);
                   glTexCoord2f(0,1);       
                   glVertex3f(x - m_SubNodes.size , y + m_SubNodes.size ,-10);
                glEnd();
        }
//恢复原来的矩阵
        glPopMatrix();
                glMatrixMode(GL_PROJECTION);
        glPopMatrix();
        glPopAttrib();
可是在漫游的时候当发现太阳的时候就什么都消失了,变为黑屏,而且有的时候老是找不到太阳

5

主题

42

帖子

47

积分

注册会员

Rank: 2

积分
47
发表于 2005-5-27 18:08:00 | 显示全部楼层

Re:有谁做过太阳光晕即(lens flare)请求帮忙

这就是典型的 日食现象 不必惊奇 过了今天就好了

11

主题

97

帖子

206

积分

中级会员

Rank: 3Rank: 3

积分
206
QQ
发表于 2005-5-28 14:56:00 | 显示全部楼层

Re:有谁做过太阳光晕即(lens flare)请求帮忙

可是在漫游的时候当发现太阳的时候就什么都消失了,变为黑屏
呵呵,在来个
glMatrixMode(GL_MODELVIEW)就好了!

2

主题

27

帖子

27

积分

注册会员

Rank: 2

积分
27
发表于 2005-5-30 14:21:00 | 显示全部楼层

Re:有谁做过太阳光晕即(lens flare)请求帮忙

你会做这个, 偶不会:)

0

主题

20

帖子

20

积分

注册会员

Rank: 2

积分
20
QQ
发表于 2005-8-17 17:32:00 | 显示全部楼层

Re: 有谁做过太阳光晕即(lens flare)请求帮忙

最近我也做这方面,参考的是林海雪原的代码(部分如下),可就是不能与自己的坐标系统很好的融合,部分数值就是不懂~~
void CLensFlare::RenderLensFlare()
{
        if(!CheckLightVisible())return;

        float size=0.06f;
    float offset=1;
        glAlphaFunc(GL_GEQUAL,0.15f);
        glEnable(GL_ALPHA_TEST);

        glDisable(GL_DEPTH_TEST);
        glBlendFunc(GL_SRC_ALPHA,GL_ONE);
        glEnable(GL_BLEND);
           glEnable(GL_TEXTURE_2D);
    glPushMatrix();       

        glTranslatef(m_cHmap.m_ViewPos.xpos,m_cHmap.m_ViewPos.ypos,m_cHmap.m_ViewPos.zpos);
          glRotatef(m_cHmap.m_ViewRotY,  0.0f,1.0f,0.0f);
        glRotatef(-m_cHmap.m_ViewRotX,  1.0f,0.0f,0.0f);
    /////////////////////1
        glBindTexture(GL_TEXTURE_2D, m_texFlare[1]);
        glColor3f(0.05f,0.3f,0.5f);

        offset=1.3f;
        size=0.08f;
          glBegin(GL_QUADS);
            glTexCoord2f(0,0);
                glVertex3f(sx*offset-size,sy*offset-size,-1.03923f);

            glTexCoord2f(1,0);
                glVertex3f(sx*offset+size,sy*offset-size,-1.03923f);

            glTexCoord2f(1,1);
                glVertex3f(sx*offset+size,sy*offset+size,-1.03923f);

            glTexCoord2f(0,1);
                glVertex3f(sx*offset-size,sy*offset+size,-1.03923f);
    glEnd();       
    /////////////////////2
        glBindTexture(GL_TEXTURE_2D, m_texFlare[2]);
        glColor3f(0.0f,0.3f,0.5f);
       
        offset=0.7f;
        size=0.03f;
          glBegin(GL_QUADS);
            glTexCoord2f(0,0);
                glVertex3f(sx*offset-size,sy*offset-size,-1.03923f);

            glTexCoord2f(1,0);
                glVertex3f(sx*offset+size,sy*offset-size,-1.03923f);

            glTexCoord2f(1,1);
                glVertex3f(sx*offset+size,sy*offset+size,-1.03923f);

            glTexCoord2f(0,1);
                glVertex3f(sx*offset-size,sy*offset+size,-1.03923f);
    glEnd();       
    /////////////////////3
        glBindTexture(GL_TEXTURE_2D, m_texFlare[3]);
        glColor3f(0.05f,0.3f,0.5f);
         
        offset=0.5f;
        size=0.04f;
          glBegin(GL_QUADS);
            glTexCoord2f(0,0);
                glVertex3f(sx*offset-size,sy*offset-size,-1.03923f);

            glTexCoord2f(1,0);
                glVertex3f(sx*offset+size,sy*offset-size,-1.03923f);

            glTexCoord2f(1,1);
                glVertex3f(sx*offset+size,sy*offset+size,-1.03923f);

            glTexCoord2f(0,1);
                glVertex3f(sx*offset-size,sy*offset+size,-1.03923f);
    glEnd();       
    /////////////////////4
        glBindTexture(GL_TEXTURE_2D, m_texFlare[4]);
        glColor3f(0.4f,0.1f,0.0f);
         
        offset=0.1f;
        size=0.06f;
          glBegin(GL_QUADS);
            glTexCoord2f(0,0);
                glVertex3f(sx*offset-size,sy*offset-size,-1.03923f);

            glTexCoord2f(1,0);
                glVertex3f(sx*offset+size,sy*offset-size,-1.03923f);

            glTexCoord2f(1,1);
                glVertex3f(sx*offset+size,sy*offset+size,-1.03923f);

            glTexCoord2f(0,1);
                glVertex3f(sx*offset-size,sy*offset+size,-1.03923f);
    glEnd();       
    /////////////////////5
        glBindTexture(GL_TEXTURE_2D, m_texFlare[5]);
        glColor3f(0.3f,0.05f,0.0f);
         
        offset=-0.3f;
        size=0.12f;
          glBegin(GL_QUADS);
            glTexCoord2f(0,0);
                glVertex3f(sx*offset-size,sy*offset-size,-1.03923f);

            glTexCoord2f(1,0);
                glVertex3f(sx*offset+size,sy*offset-size,-1.03923f);

            glTexCoord2f(1,1);
                glVertex3f(sx*offset+size,sy*offset+size,-1.03923f);

            glTexCoord2f(0,1);
                glVertex3f(sx*offset-size,sy*offset+size,-1.03923f);
    glEnd();       
    /////////////////////6
        glBindTexture(GL_TEXTURE_2D, m_texFlare[6]);
        glColor3f(0.3f,0.0f,0.0f);
         
        offset=-0.9f;
        size=0.14f;
          glBegin(GL_QUADS);
            glTexCoord2f(0,0);
                glVertex3f(sx*offset-size,sy*offset-size,-1.03923f);

            glTexCoord2f(1,0);
                glVertex3f(sx*offset+size,sy*offset-size,-1.03923f);

            glTexCoord2f(1,1);
                glVertex3f(sx*offset+size,sy*offset+size,-1.03923f);

            glTexCoord2f(0,1);
                glVertex3f(sx*offset-size,sy*offset+size,-1.03923f);
    glEnd();       
        ////////////////////////////////////////////////
        /////////////////////Draw light Shine
       
        glBindTexture(GL_TEXTURE_2D, m_texFlare[0]);
        glTranslatef(sx,sy,0);
        float dist=float(sqrt(sx*sx+sy*sy));

    glRotatef((m_cHmap.m_ViewRotY+m_cHmap.m_ViewRotX)*2,  0.0f,0.0f,1.0f);
        glColor3f(0.7f-dist*0.2f,0.5f-dist*0.5f,0.4f-dist*0.6f);

    glColor3f(0.8f+dist*0.5f,0.6f-dist*0.4f,0.2f);//0.3f-dist*0.4f);

        size=0.17f-dist*0.04f;
          glBegin(GL_QUADS);
            glTexCoord2f(0,0);
                glVertex3f(-size,-size,-1.03923f);

            glTexCoord2f(1,0);
                glVertex3f(+size,-size,-1.03923f);

            glTexCoord2f(1,1);
                glVertex3f(+size,+size,-1.03923f);

            glTexCoord2f(0,1);
                glVertex3f(-size,+size,-1.03923f);
    glEnd();       
        ////////////////////////////////////////////////
        glColor3f(1,1,1);
glPopMatrix();
        glDisable(GL_BLEND);
        glDisable(GL_ALPHA_TEST);
        glEnable(GL_DEPTH_TEST);

}
bool CLensFlare::CheckLightVisible()
{
        VERTEX v0=VERTEX(m_LightPos.xpos-m_cHmap.m_ViewPos.xpos,
                             m_LightPos.ypos-m_cHmap.m_ViewPos.ypos,
                                         m_LightPos.zpos-m_cHmap.m_ViewPos.zpos);
        float rotx=m_cHmap.m_ViewRotX;
        float roty=m_cHmap.m_ViewRotY;
        //////// y rotate
    VERTEX v1=VERTEX(v0.xpos*cosf(roty*0.0174533f)-v0.zpos*sinf(roty*0.0174533f),
                                 v0.ypos,
                     v0.xpos*sinf(roty*0.0174533f)+v0.zpos*cosf(roty*0.0174533f));

    //////// x rotate
    VERTEX v2=VERTEX(v1.xpos,
                             v1.ypos*cosf(rotx*0.0174533f)-v1.zpos*sinf(rotx*0.0174533f),
                     v1.ypos*sinf(rotx*0.0174533f)+v1.zpos*cosf(rotx*0.0174533f));

        ////////////////////
        if(v2.zpos>-1)return false;
        double scale=-1.03923/v2.zpos;
        sx=float(v2.xpos*scale);
        sy=float(v2.ypos*scale);
        if(sx>0.8f || sx<-0.8f)return false;
        if(sy>0.6f || sy<-0.6f)return false;

        //////// Check Visible
        int halfScrW=CGameSetting::m_iScrWidth/2;
        int halfScrH=CGameSetting::m_iScrHeight/2;
        float depth[4];

        glReadPixels(int(sx*500)+halfScrW,halfScrH+int(sy*500),1,1,GL_DEPTH_COMPONENT,GL_FLOAT,depth);
    if(depth[0]>0.9999f)return true;
        glReadPixels(int(sx*500)+halfScrW+5,halfScrH+int(sy*500)+5,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,depth);
    if(depth[0]>0.9999f)return true;
        glReadPixels(int(sx*500)+halfScrW+5,halfScrH+int(sy*500)-5,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,depth);
    if(depth[0]>0.9999f)return true;
        glReadPixels(int(sx*500)+halfScrW-5,halfScrH+int(sy*500)+5,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,depth);
    if(depth[0]>0.9999f)return true;
        glReadPixels(int(sx*500)+halfScrW-5,halfScrH+int(sy*500)-5,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,depth);
    if(depth[0]>0.9999f)return true;
        glReadPixels(int(sx*500)+halfScrW+10,halfScrH+int(sy*500),1,1,GL_DEPTH_COMPONENT,GL_FLOAT,depth);
    if(depth[0]>0.9999f)return true;
        glReadPixels(int(sx*500)+halfScrW-10,halfScrH+int(sy*500),1,1,GL_DEPTH_COMPONENT,GL_FLOAT,depth);
    if(depth[0]>0.9999f)return true;
        glReadPixels(int(sx*500)+halfScrW,halfScrH+int(sy*500)+10,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,depth);
    if(depth[0]>0.9999f)return true;
        glReadPixels(int(sx*500)+halfScrW,halfScrH+int(sy*500)-10,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,depth);
    if(depth[0]>0.9999f)return true;

    return false;
}

2

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2005-8-18 10:57:00 | 显示全部楼层

Re:有谁做过太阳光晕即(lens flare)请求帮忙

菜鸟,哈哈,自己打个灯泡上去好了

1

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2006-5-28 19:36:00 | 显示全部楼层

Re:有谁做过太阳光晕即(lens flare)请求帮忙

同问

1

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2006-5-28 19:38:00 | 显示全部楼层

Re: 有谁做过太阳光晕即(lens flare)请求帮忙

同问

55

主题

331

帖子

337

积分

中级会员

Rank: 3Rank: 3

积分
337
发表于 2006-5-29 19:24:00 | 显示全部楼层

Re:有谁做过太阳光晕即(lens flare)请求帮忙

看看我的博客,http://juedno.blog.163.com/-24L-.html  ,倒数第三篇帖子。

55

主题

331

帖子

337

积分

中级会员

Rank: 3Rank: 3

积分
337
发表于 2006-5-29 19:27:00 | 显示全部楼层

Re:有谁做过太阳光晕即(lens flare)请求帮忙

需要代码的话联系我 (Free)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 15:31

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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