我正在研究一个类项目,我需要使用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);
}
}
};