首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >撕入片段程序(GLSL)

撕入片段程序(GLSL)
EN

Stack Overflow用户
提问于 2013-10-04 01:12:35
回答 1查看 262关注 0票数 2

我一直致力于样式化我的照明着色器,但遇到了一个小问题。我的主开发计算机有一个ATI卡,它渲染我的新照明场景没有任何问题。然而,NVIDIA卡往往会显示失真或撕裂。这看起来几乎像是zbuffer的问题,但我完全不知道问题是什么。我在这里截取了一个屏幕截图:http://i.imgur.com/CT5ymGH.png (注意脸部的“抖动”)

以下是片段程序的相关部分:

代码语言:javascript
运行
复制
in vec3 vertex_color;
in vec4 vertex_position;

out vec4 fragment_color;

uniform vec3 playerPosition;

void main(void)
{
  float playerDistanceTorch = length(playerPosition - floor(vertex_position.xyz));
  float playerTorch = (160 - playerDistanceTorch * playerDistanceTorch);
  fragment_color = vec4(vertex_color, 1) * clamp(playerTorch * 0.005, 0, 1);
}

同样,到目前为止,这似乎只影响我的测试中的NVIDIA卡,所以我很困惑。我的第一个猜测是浮点精度错误,所以我尝试尽可能长时间地保持playerTorch较大(原始代码为0.8 - 0.005*playerDistanceTorch*playerDistanceTorch).

编辑:通过一些实验,我发现这个问题来自于vertex_position的线性插值。如果我将这个值设为“扁平”(这样就不会发生插值),那么撕裂就会消失。然而,这并没有给出预期的效果。

EN

回答 1

Stack Overflow用户

发布于 2013-10-04 01:58:33

它几乎看起来像z-fighting,确保你的立方体不会被渲染两次。我还看到你的alpha通道被调制了,也许你的混合是启用的,你有不想要的混合。如果是这样的话,试一下:

代码语言:javascript
运行
复制
fragment_color = vec4(vertex_color * clamp(playerTorch * 0.005, 0, 1), 1);

而不是。或者,如果您不需要任何混合,请禁用混合。希望这能有所帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19165203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档