光影不在opengl和c ++中工作
我正在创建太阳能系统,并一直遇到照明问题。 第一个问题是月球在地球上没有阴影,地球在月球上没有阴影。 另一个问题是,照射在地球和月球上的光线不是来自我的太阳,而是来自轨道的中心点。 我在下面的图片中添加了红线以显示我的意思。
下面的图片应该说明我的两个问题。
这是处理灯光和行星的代码。
glDisable(GL_LIGHTING);
drawCircle(800, 720, 1, 50);
//SUN
//Picture location, major radius, minor radius, major orbit, minor orbit, angle
Planet Sun ("/home/rodrtu/Desktop/SolarSystem/images/Sun.png",
100, 99, 200.0, 0.0, 0.0);
double sunOrbS = 0;
double sunRotS = rotatSpeed/10;
cout << sunRotS << " Sun Rotation" << endl;
//orbit speed, rotation speed, moon reference coordinates (Parent planet's major and minor Axis)
Sun.displayPlanet(sunOrbS, sunRotS, 0.0, 0.0);
//Orbit path
//EARTH
GLfloat light_diffuse[] = { 1.5, 1.5, 1.5, 1.5 };
GLfloat pos[] = { 0.0, 0.0, 0.0, 200.0 };
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_POSITION, pos);
Planet Earth ("/home/rodrtu/Desktop/SolarSystem/images/EarthTopography.png",
50, 49, 500.0, 450.0, 23.5);
double eaOrbS = orbitSpeed;
double eaRotS = rotatSpeed*3;
Earth.displayPlanet(eaOrbS, eaRotS, 0.0, 0.0);
//EARTH'S MOON
Planet Moon ("/home/rodrtu/Desktop/SolarSystem/images/moonTest.png",
25, 23, 100.0, 100.0, 15);
double moOrbS = rotatSpeed*4;
double moRotS = eaOrbS;
Moon.displayPlanet(moOrbS, moRotS, Earth.getMajorAxis(), Earth.getMinorAxis());
orbitSpeed+=.9;
if (orbitSpeed > 359.0)
orbitSpeed = 0.0;
rotatSpeed+=2.0;
if (rotatSpeed > 7190.0)
rotatSpeed = 0.0;
下一个函数用于确定每个行星的轨道坐标和位置
void Planet::setOrbit(double orbitSpeed, double rotationSpeed,
double moonOrbitX, double moonOrbitY)
{
majorAxis = orbitSemiMajor * cos(orbitSpeed / 180.0 * Math::Constants<double>::pi);
minorAxis = orbitSemiMinor * sin(orbitSpeed / 180.0 * Math::Constants<double>::pi);
glTranslate(majorAxis+moonOrbitX, minorAxis+moonOrbitY, 0.0);
glRotatef(orbitAngle, 0.0, 1.0, 1.0);
glRotatef(rotationSpeed, 0.0, 0.0, 1.0);
}
void Planet::displayPlanet(double orbitSpeed,double rotationSpeed,
double moonOrbitX, double moonOrbitY)
{
GLuint surf;
Images::RGBImage surfaceImage;
surfaceImage=Images::readImageFile(texture);
glEnable(GL_TEXTURE_2D);
glGenTextures(0, &surf);
glBindTexture(GL_TEXTURE_2D, surf);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
surfaceImage.glTexImage2D(GL_TEXTURE_2D,0,GL_RGB);
glPushMatrix();
setOrbit(orbitSpeed,rotationSpeed, moonOrbitX, moonOrbitY);
drawSolidPlanet(equatRadius, polarRadius, 1, 40, 40);
glPopMatrix();
}
我究竟做错了什么? 我读了GL_POSITION的w部分,并将我的位置改为200(太阳居中位置),但光源仍然来自轨道中心。
为灯光位置问题做出正确答复..
[X, Y, Z, W]
被称为同质坐标
同质空间中的坐标[X, Y, Z, W]
[X/W, Y/W, Z/W]
在3D空间中将为[X/W, Y/W, Z/W]
。
现在,请考虑以下W值:
W=1.0
:在3D位置[1.0, 1.0, 1.0]
[1.0, 1.0, 1.0, 1.0]
为[1.0, 1.0, 1.0]
。 W=0.1
:在3D位置[10.0, 10.0, 10.0]
[1.0, 1.0, 1.0, 0.1]
为[10.0, 10.0, 10.0]
。 W=0.001
:在3D位置[1000.0, 1000.0, 1000.0]
[1.0, 1.0, 1.0, 0.001]
为[1000.0, 1000.0, 1000.0]
。 当我们继续向W=0
移动时, [X/W, Y/W, Z/W]
值接近无穷远点。 它实际上不再是一个点,而是从[0,0,0]
到[X,Y,Z]
。
因此,在定义光照位置时,我们需要确保正确地做到这一点。
W=0
定义了一个方向光,所以x,y,z是一个方向向量 W=1
定义了一个位置光,所以x,y,z是三维空间中的一个位置 一旦你深入挖掘矩阵数学,你将会玩得很开心。 例如,如果尝试用转换矩阵转换方向(W=0)
,它将不起作用。 这在这里也非常相关,因为灯光位置会受到模型视图矩阵的影响。
一些容易理解的信息在这里进一步阅读:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/
如果OpenGL没有“投影”功能,那我怎么能这样做呢?
你必须明白的是,OpenGL没有“场景”的概念。 OpenGL的所有功能都是逐点绘制点,线或三角形。 绘制完成后,它对以下绘图操作没有影响。
所以要做一些喜欢阴影的事情,你必须得到,很好,艺术。 我的意思是,就像一个艺术家描绘一幅具有“仅仅”画笔和色彩调色板的塑料图片一样,您必须以艺术的方式使用OpenGL来重现您所期望的效果。 绘制阴影可以通过各种方式完成。 但最受欢迎的一个是阴影贴图术语。
阴影映射是一个两步过程。 在第一步中,场景被渲染成从光的角度看“看到”的“灰度”图片,其中与光的距离被描绘为“灰色”值。 这被称为阴影深度图。
在第二步中,场景按照惯例绘制,灯光的阴影深度图投影到场景中,就好像灯光是幻灯机(所有东西都接收该图像,因为OpenGL不影)。 在着色器中,阴影深度图中的深度值与每个处理过的片段到光源的实际距离进行比较; 如果到光线的距离比阴影贴图中的对应像素更远,这意味着在渲染阴影贴图的同时在当前处理的几何片段的前面获得了某些东西,因此位于阴影中,所以它被绘制为阴影颜色(通常是环境照明颜色); 您可能希望将其与Ambient Occlusion效果结合使用,以模拟柔和的自身阴影环境照明。
链接地址: http://www.djcxy.com/p/78207.html上一篇: Light and shadow not working in opengl and c++
下一篇: OpenGL object glossy/shiny in Mac OS X 10.6, but not 10.5. Why?