Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在OpenGL中创建廉价阴影?_C_Opengl_3d_Shadow - Fatal编程技术网

C 如何在OpenGL中创建廉价阴影?

C 如何在OpenGL中创建廉价阴影?,c,opengl,3d,shadow,C,Opengl,3d,Shadow,我有两个模型,A和B,还有一个灯光,L。我希望模型A在模型B上投射阴影。我现在不想麻烦阴影体积或适当的阴影,只要一个简单的圆形阴影就足够了。其效果是模型A被视为用于阴影投射的球体 以下是我对算法的设想: 对于模型B中的每个三角形,绘制三角形。沿从L到a的直线在三角形上投影一个圆,根据三角形的距离增加圆的大小。确保圆被剪裁到三角形的边界上(我想是以某种方式使用模具缓冲区) 我正在使用OpenGL和普通C 我可以阅读一些参考文档中的任何提示吗?还是实现想法?我认为实现正确的阴影实际上更容易,因为Op

我有两个模型,A和B,还有一个灯光,L。我希望模型A在模型B上投射阴影。我现在不想麻烦阴影体积或适当的阴影,只要一个简单的圆形阴影就足够了。其效果是模型A被视为用于阴影投射的球体

以下是我对算法的设想:

对于模型B中的每个三角形,绘制三角形。沿从L到a的直线在三角形上投影一个圆,根据三角形的距离增加圆的大小。确保圆被剪裁到三角形的边界上(我想是以某种方式使用模具缓冲区)

我正在使用OpenGL和普通C


我可以阅读一些参考文档中的任何提示吗?还是实现想法?

我认为实现正确的阴影实际上更容易,因为OpenGL可以为您完成这项工作

我在这里找到了一个包含大量文档的影子代码:

上面的代码渲染对象两次:首先正常渲染,然后使用特殊矩阵渲染。它做很多不相关的事情,比如用鼠标控制和反射。下面是有趣的部分

这将计算阴影矩阵:

/* Create a matrix that will project the desired shadow. */
void
shadowMatrix(GLfloat shadowMat[4][4],
  GLfloat groundplane[4],
  GLfloat lightpos[4])
{
  GLfloat dot;

  /* Find dot product between light position vector and ground plane normal. */
  dot = groundplane[X] * lightpos[X] +
    groundplane[Y] * lightpos[Y] +
    groundplane[Z] * lightpos[Z] +
    groundplane[W] * lightpos[W];

  shadowMat[0][0] = dot - lightpos[X] * groundplane[X];
  shadowMat[1][0] = 0.f - lightpos[X] * groundplane[Y];
  shadowMat[2][0] = 0.f - lightpos[X] * groundplane[Z];
  shadowMat[3][0] = 0.f - lightpos[X] * groundplane[W];

  shadowMat[X][1] = 0.f - lightpos[Y] * groundplane[X];
  shadowMat[1][1] = dot - lightpos[Y] * groundplane[Y];
  shadowMat[2][1] = 0.f - lightpos[Y] * groundplane[Z];
  shadowMat[3][1] = 0.f - lightpos[Y] * groundplane[W];

  shadowMat[X][2] = 0.f - lightpos[Z] * groundplane[X];
  shadowMat[1][2] = 0.f - lightpos[Z] * groundplane[Y];
  shadowMat[2][2] = dot - lightpos[Z] * groundplane[Z];
  shadowMat[3][2] = 0.f - lightpos[Z] * groundplane[W];

  shadowMat[X][3] = 0.f - lightpos[W] * groundplane[X];
  shadowMat[1][3] = 0.f - lightpos[W] * groundplane[Y];
  shadowMat[2][3] = 0.f - lightpos[W] * groundplane[Z];
  shadowMat[3][3] = dot - lightpos[W] * groundplane[W];

}
我并不假装完全理解这一点。lightpos是光源的位置。地平面的前3个坐标是地平面的法向量。第四个是偏移量(距离0,0,0有多远)

这部分实际上渲染了阴影:

glPushMatrix();
/* Project the shadow. */
glMultMatrixf((GLfloat *) floorShadow);
drawDinosaur();
glPopMatrix();
有一些事情需要glEnable/glDisable才能让它工作,所以请查看链接。

似乎涵盖了您的需求,使用OpenGL和硬件加速创建详细的阴影图


如果我试图实现这一点,我会尝试使用光线投射。对于B中的每个三角形,创建一个从三角形到灯光的矢量。如果一路上碰到什么东西,它就在阴影中。这将是一种缓慢,除非你使用一个像样的加速结构和一个快速的三角形命中测试。我喜欢;许多程序也使用它们进行碰撞检测

这只是将模型“展平”到平面上。。用于将阴影投影到平面上。OP想要将阴影渲染到任意形状的3d对象上。这个应该可以做到:不幸的是,我不能用gcc编译它。这个方法看起来不错,但在B中为每个面绘制一次源模型的成本似乎很高。有没有办法降低这种方法的复杂度?我已经确定了(目前)这种方法,对模型B的每个三角形迭代一次,它似乎有效,但速度还有待提高。非常感谢。以下是至少完整代码的工作链接: