检索投影阴影计算的对象位置

时间:2014-03-11 20:57:31

标签: c++ opengl

我正在研究一个类项目,我需要使用OpenGL-esque编码在我们的项目中实现阴影。我们的具体项目是围绕房屋的蜘蛛。我需要在蜘蛛下方的地板上出现阴影(不要关心阴影)。

我需要回答的主要问题是:在计算阴影时,如何在蜘蛛上检索一个点?在我们的笔记中,它说我们有3个数量以便开始我们的初始计算:1)平面(我们知道A,B,C,D)2)光源在(Lx,Ly,Lz)3)空间点q:暗影施法者

我不明白如何检索" q"。我们使用" Mesh"加载蜘蛛网。和" SuperMesh"类,并将网格传递到顶点着色器,但我不明白如何在CPU端引用蜘蛛上的点。

我对发布我的所有代码犹豫不决,主要是因为这个项目使用了一个特殊的库" llgl"这是基于OpenGL的,我们的老师明确表达了这个课程(使调试非常容易,对吧?),而且我不能完全确定为了正确回答我的问题需要什么。我将包括Mesh和SuperMesh类,以及加载spider并将其作为矩阵传递给顶点着色器的声明(这更相关)。如果您需要更多代码,请提出要求。希望它更像是一个理论"响应而不是语法响应,所以我不会让任何试图理解我们代码的人感到沮丧,哈哈。

感谢您的时间。

Main:(为简单起见,所有多余的代码都被删除了)

...
SuperMesh* spider = new SuperMesh("spider/SmoothSpider.spec.mesh");
mat4 spiderR = rotationY(M_PI);      // Rotation matrix for spider
vec3 spiderT(0,-2.5,-8.0);  // Translation for spider
...

... (in draw)
//prog1 simply defines the txt files for the vertex and fragment shader
prog1->setUniform("worldMatrix",  // sets world matrix for spider
        spiderR * translation(vec4(spiderT.x,
                                    spiderT.y,
                                    spiderT.z,
                                    0.0)));
    spider->draw(prog1);
...

网格:(希望不需要)

#ifndef MESH_H
#define MESH_H

#include "llgl.h"
#include <string>
#include <vector>

using namespace std;
using namespace llgl;

class Mesh{
  public:
    string fname;
    bool initialized;
    vector<uint8_t> vdata;
    vector<uint8_t> idata;
    vec4 color;
    vec4 scolor;
    int isize;
    GLenum ienum;
    unsigned vbuff,ibuff;
    uint32_t ni;
    TextureX* diffusetex;
    TextureX* ramp;//used for cell shading, this is the "gradient"

    Mesh(string fname);
    void setup();
    void draw(Program& prog);
    void draw(Program* prog){ draw(*prog); }

};


#endif

超网:

#pragma once

#include "Mesh.h"
#include <iostream>
#include <vector>
#include <string>
#include <fstream>

using namespace std;

struct SuperMesh
{
    vector<Mesh*> m;
    string fname;
    bool loaded;
    SuperMesh(string specfile)
    {
        fname = specfile;
        loaded = false;
    }

    void load()
    {
        if(loaded)
            return;

        ifstream in(fname.c_str());
        if(!in.good())
            throw runtime_error("Cannot load file " + fname);

        string pfx;
        unsigned slashidx;
        slashidx = fname.find("/");
        if(slashidx == string::npos)
            slashidx = fname.find("\\");
        if(slashidx != string::npos)
            pfx = fname.substr(0, slashidx) + "/";

        while(1)
        {
            string s;
            getline(in, s);
            if(in.fail())
                break;

            if(s.find("binarymesh ") == 0)
            {
                string fname = s.substr(11);
                m.push_back(new Mesh(pfx + fname));
                m.back()->setup();
            }
        }
        loaded = true;
    }

    void draw(Program* p)
    {
        if(!loaded)
            load();
        for(unsigned i = 0; i < m.size(); ++i)
        {
            m[i]->draw(p);
        }
    }
};

0 个答案:

没有答案