- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 OpenGL 程序中,我注意到在前向渲染算法中光线混合在一起的地方出现了黑色像素。起初我忽略了它,直到它在视觉上变得太有问题时我切换了 Window API(SDL 到 GLFW)。
当我禁用 GL_DEPTH_TEST 时,黑色伪影消失,但事物对它们背后的灯光变得透明,因此这不是解决方案。 (这就是我发现潜在问题的方式)
我不确定问题出在深度缓冲区上,但切换窗口 API 会增强伪像,有什么帮助吗?
似乎黑线/点在每个三角形内是孤立的
这是我混合灯光的地方
// Note: I wrapped OpenGL calls into wrapper functions but the naming convenction is still the same
gl::Clear(gl::e_ColorBufferBit | gl::e_DepthBufferBit);
mesh->Render(m_forward_ambient);
gl::Enable(gl::e_Blend);
gl::SetBlendFunc(gl::e_One, gl::e_One); // Additive blending
gl::SetDepthMask(false); // No need to write to depth buffer
gl::SetDepthFunc(gl::e_Equal); // Only draw fragments of equal depths (ignore fragments behind basically)
{
for (word i = 0; i < m_lights.Length(); ++i)
{
m_active_light = m_lights[i];
mesh->Render(m_active_light->shader); // Shaders use active light
}
}
gl::SetDepthFunc(gl::e_Lequal); // Restore default state
gl::SetDepthMask(true);
gl::Disable(gl::e_Blend);
Shader Code(shader有全部代码,其他实现较少)
// Vertex
void main()
{
// pv_matrix is projection and camera, ml_matrix is model transform
gl_Position = pv_matrix * ml_matrix * vec4(pos, 1);
f_pos = (ml_matrix * vec4(pos, 1)).xyz;
f_nrm = (ml_matrix * vec4(normalize(nrm), 0)).xyz;
f_txc = txc;
}
// Fragment
struct Light
{
vec3 color;
float intensity;
};
struct Attenuation
{
float constant;
float linear;
float exponent;
};
struct PointLight
{
Light light;
Attenuation atten;
vec3 position;
float range;
};
struct SpotLight
{
PointLight plight;
vec3 direction;
float cutoff;
};
vec4 CalculateLight(Light light, vec3 direction, vec3 normal)
{
float diffuse_factor = dot(normal, -direction);
vec4 diffuse_color = vec4(0, 0, 0, 0);
vec4 specular_color = vec4(0, 0, 0, 0);
if (diffuse_factor > 0)
diffuse_color = vec4(light.color, 1) * light.intensity * diffuse_factor;
vec3 direction_to_eye = normalize(eye_pos - f_pos); // eye_pos is uniform for camera pos, f_pos is (position) attribute sent from vertex shader
vec3 reflect_direction = normalize(reflect(direction, normal));
float specular_factor = dot(reflect_direction, direction_to_eye); // specular calculations
if (specular_factor > 0)
{
specular_factor = pow(specular_factor, specular_power);
specular_color = vec4(light.color, 1) * specular_intensity * specular_factor;
}
return diffuse_color + specular_color;
}
vec4 CalculatePointLight(PointLight plight, vec3 normal)
{
vec3 light_direction = f_pos - plight.position;
float distance = length(light_direction);
if (distance > plight.range)
return vec4(0, 0, 0, 0);
light_direction = normalize(light_direction);
vec4 color = CalculateLight(plight.light, light_direction, normal);
float a = plight.atten.constant + (plight.atten.linear * distance) + (plight.atten.exponent * (distance * distance)) + 0.0001;
return color / a;
}
vec4 CalculateSpotLight(SpotLight slight, vec3 normal)
{
vec3 light_direction = normalize(f_pos - slight.plight.position);
float spot_factor = dot(light_direction, slight.direction);
vec4 color = vec4(0, 0, 0, 0);
if (spot_factor > slight.cutoff)
color = CalculatePointLight(slight.plight, normal) * (1.0 - ((1.0 - spot_factor) / (1.0 - slight.cutoff)));
return color;
}
uniform SpotLight spot_light;
void main()
{
FragColor = CalculateSpotLight(spot_light, f_nrm); // f_nrm is a (normal) attribute sent from vertex shader
}
最佳答案
您没有将您的 gl_Position
顶点着色器输出声明为 invariant
,因此即使您在两次传递中使用完全相同的公式和按位完全相同的输入,您的着色器不能保证得到完全相同的结果。您应该添加适当的 invariance qualifiers到所有 channel 中的所有着色器。
关于c++ - 为什么前向渲染灯时会出现 Z-fighting?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44352059/
我正在尝试学习 MVVM Light 并将其用于我的 Windows Phone 8 应用程序。它工作得很好,但我找不到任何教程或示例如何使用带有 MVVM 模式的推送通知。 在我的 MainPage
我得到了一些代码来分析。此代码启用键盘上的 numLock 和scrollLock LED。我理解这段代码的大部分,但是我不理解循环部分(0104)。我知道这是为了等待输入缓冲区为空。但有必要吗?如果
我有一部运行 Android 8 的手机,我开始使用 Android Studio 进行 Android 编程。当收到通知时,Snapchat 或 Facebook 等一些应用程序会让我的手机点亮带有
我有一个用java编写的2D瓦片 map (使用libgdx,没有瓦片 map 编辑器),由正方形组成,我希望瓦片逐渐变暗,直到它们不可见。所以基本上我不想要圆形光。我知道的唯一选择是使用 Alpha
我的应用程序的用户需要能够安排特定任务在特定时间运行(例如,仅一次、每分钟、每小时等)。我的计划是让 cron 每分钟运行一个脚本来检查应用程序是否有要执行的任务。如果是,则执行任务。 问题: 每分钟
我有一个 USB 供电的小灯。我希望能够使用软件打开和关闭它。我会将它附加到 Linux 计算机上。我有一个 Atmel ATtiny2313来自previous project ,但我宁愿通过简单的
是否可以使用 Python 开发一个读取浏览器中可用的数字证书的网页?例如使用 pyOpenSSL? 我进一步解释: 我想开发一个网页,提示用户并要求他选择浏览器中可用的数字证书之一,然后打印其中包含
如何在运行时在three.js 中添加和删除不同的灯光类型? 我有一些复选框,每个复选框代表一种灯光类型,我想在选中它的复选框时向场景添加某种灯光类型,并在未选中时删除灯光。 我试过:scene.re
我有一个典型的 MVVM 结构。一个主窗口由一些标签和一个 View 模型(绑定(bind)为 ContentControl)组成。这个 View 模型有一个列表框,我可以在其中添加条目。随着列表的增
我正在使用 lightSlider,我想在同一页面的其他地方使用另一个。我在这里使用这个 slider 形式 http://sachinchoolur.github.io/lightslider/我为
我正在关注这个 netbean 指南 https://netbeans.org/kb/docs/php/configure-php-environment-ubuntu.html#createDocu
是否执行以下技术: for(int light=GL_LIGHT0; light == GL_LIGHT0 + n 关于c++ - gl.h #defines 灯,我们在Stack Overflow上
我想创建一个程序来使用键盘的 LED 表示二进制数。如何使用 C 语言控制这些 LED 灯? 最佳答案 对于 Linux,这会很有帮助 setleds 更全面的内部结构和几个命令行实用程序描述 Key
在我的应用中,我使用了 Google Material Light 库。 而且我不想检查我的输入(直到某些逻辑正确),这就是我添加这样的指令的原因: app.directive('updLink',
我正在使用 mvvm light 来构建 Silverlight 应用程序。 是否有代码片段显示如何从另一个 View 模型或用户控件的代码中访问 View 模型的属性或命令? 我想这很简单,但不知何
感谢您花时间阅读我的问题。非常感谢任何指导。 我在我的 LOB 应用程序中使用 SL3 导航框架。我目前使用 MVVM Light 作为框架指南。 我有一个由员工组成的数据网格,当“用户”单击数据网格
我的办公室里到处都是飞利浦 HUE 灯,我一直在努力寻找一种方法,让它们在低于设定的勒克斯/环境光发光时打开,这样我们就不必等到有人意识到它太暗了并将它们全部打开。如果他们按照设置补充提供给太阳的照明
我想控制 MacBook 或 iMac 上的“ sleep ”灯。 也就是说,我希望能够让它打开、关闭和跳动。 我很高兴在用户模式或内核模式下这样做。我想我需要root。 有什么想法吗? 最佳答案 您
无论我怎么试,都没有通知灯。我正在运行 Android 26 Oreo。我的手机仅在收到消息和未接来电时显示闪烁灯。 String CHANNEL_ID = "my_channel_01"; Noti
我正在创建的 Web 应用程序使用 jquery lights out 并有一个内部表单的 html iframe。使用此应用程序的任何人都必须按下提交按钮。有没有一种方法可以链接提交按钮周围的自由空
我是一名优秀的程序员,十分优秀!