Tag: 照明

计算基于图块的游戏中的哪些图块点亮(“光线跟踪”)

我正在写一个基于平铺的小游戏,为此我想支持光源。 但是我的algorithm太弱了,所以我来找你帮忙。 情况是这样的:有一个基于瓦片的地图(作为一个二维arrays),包含一个光源和几个项目。 我想要计算哪些瓦片是由光源点亮的,哪些在阴影下。 大概是什么样子的视觉辅助。 L是光源,X是挡光的物品,0是点亮的瓷砖,-s是阴影中的瓷砖。 0 0 0 0 0 0 – – 0 0 0 0 0 0 0 – 0 0 0 0 0 0 0 X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 L 0 0 0 0 0 0 0 0 […]

WebGL和ThreeJS中改进的区域照明

我一直在研究与WebGL相似的区域照明实现: http://threejs.org/examples/webgldeferred_arealights.html three.js中的上述实现已经从gamedev.net上的ArKano22的工作中移出: http://www.gamedev.net/topic/552315-glsl-area-light-implementation/ 虽然这些解决scheme非常令人印象深刻,但它们都有一些限制。 ArKano22最初实现的主要问题是漫射项的计算不考虑曲面法线。 我几个星期以来一直在扩充这个解决scheme,通过redPlant的改进来解决这个问题。 目前我有正常的计算纳入解决scheme,但结果也有缺陷。 这是我目前实现的一个预览: 介绍 计算每个片段的漫射项的步骤如下: 将顶点投影到区域光线所在的平面上,以使投影的vector与光线的法向/方向一致。 通过比较投影向量和光的法线,检查顶点是否在区域光平面的正确的一侧。 计算平面上该投影点从光源中心/位置的二维偏移量。 钳位这个二维偏移vector,使它位于光线区域内(由其宽度和高度定义)。 导出投影和钳位的2D点的3D世界位置。 这是顶点上的最近点 。 通过取顶点到最近点向量(归一化)和顶点法线之间的点积来执行通常的漫reflection计算。 问题 这个解决scheme的问题在于,照明计算是从最近的点完成的,并且不考虑灯表面上的其他点可能更多地照亮片段。 让我试着解释为什么… 考虑下图: 面光既垂直于表面又与其相交。 表面上的每个碎片将始终返回表面和光线相交处的区域光线上的最近点 。 由于曲面法线和顶点 – 光线vector总是垂直的,它们之间的点积是零。 随后,尽pipe在表面上有大面积的光线,漫射贡献的计算是零。 潜在的解决scheme 我build议,不要从面积光线上的最近点计算光线,而是从面积光点上计算顶点到光线vector(归一化)和顶点法线之间的最大点积。 在上图中,这将是紫色点,而不是蓝色点。 帮帮我! 所以,这是我需要你的帮助。 在我的脑海里,我对这个观点是如何得出的有一个很好的想法,但是没有达到解决的math能力。 目前我在片段着色器中有以下信息: 顶点位置 顶点法线(单位vector) 光的位置,宽度和高度 光正常(单位vector) 轻右(单位vector) 点亮(单位vector) 投影点从顶点到灯光平面(3D) 距离灯光中心的投影点偏移量(2D) 夹持偏移(2D) 这个夹持偏移的世界位置 – 最近点 (3D) 为了将所有这些信息放到一个可视的上下文中,我创build了这个图(希望它有帮助): 为了testing我的build议,我需要在由红点表示的区域灯光上的投射点,以便在顶点到投射点(标准化)和顶点法线之间执行点积。 再次,这应该产生最大可能的贡献值。 UPDATE! 我已经在CodePen上创build了一个交互式的草图,它可视化我目前已经实现的math: […]

正常的映射消失了可怕的错误

我试图在我的opengl应用程序中实现正常的映射,但我无法得到它的工作。 这是漫reflection地图(我添加了一个棕色), 这是正常的地图。 为了得到切线和苦行(在其他地方叫binormals?)向量,我运行这个函数为我的网格中的每个三angular形: void getTangent(const glm::vec3 &v0, const glm::vec3 &v1, const glm::vec3 &v2, const glm::vec2 &uv0, const glm::vec2 &uv1, const glm::vec2 &uv2, std::vector<glm::vec3> &vTangents, std::vector<glm::vec3> &vBiangents) { // Edges of the triangle : postion delta glm::vec3 deltaPos1 = v1-v0; glm::vec3 deltaPos2 = v2-v0; // UV delta glm::vec2 deltaUV1 = uv1-uv0; glm::vec2 deltaUV2 = uv2-uv0; […]