- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力寻找一种方法来更好地处理游戏引擎中 3D 图 block 对象之间的接缝。只有当相机以足够远的角度向下倾斜时才能看到它们......我不相信这是纹理问题或纹理渲染问题(但我可能是错的)。
下面是两张屏幕截图 - 第一张展示了问题,第二张是我在 Blender 中对图 block 使用的 UV 包裹。我在 UV 中提供了重叠空间,这样如果纹理需要在较小的 mip 贴图期间过度绘制,我仍然应该做得很好。我正在使用以下纹理参数加载纹理:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
在我看来,3D 图 block 的侧面略有绘制,并且您会特别注意到由于从该角度应用的照明角度(方向)而产生的伪影。
有什么技巧或东西我可以检查来消除这种影响吗?我正在“图层”中渲染,但在这些图层中基于相机距离(最远的首先)。所有这些对象都位于同一层中。任何想法将不胜感激!
如果有用,这是一个使用 OpenGLES2.0 的 iPhone/iPad 项目。我很乐意提供任何代码片段 - 只需让我知道什么可能是一个好的起点。
使用顶点/像素着色器和模型顶点进行更新
目前,我使用 PowerVR 的 POD 格式来存储从 Blender 导出的模型数据(通过 PowerVR 的 Collada 和 Collada2Pod 转换器)。这是 GL_SHORT 顶点坐标(模型空间):
64 -64 32
64 64 32
-64 64 32
-64 -64 32
64 -64 -32
-64 -64 -32
-64 64 -32
64 64 -32
64 -64 32
64 -64 -32
64 64 -32
64 64 32
64 64 32
64 64 -32
-64 64 -32
-64 64 32
-64 64 32
-64 64 -32
-64 -64 -32
-64 -64 32
64 -64 -32
64 -64 32
-64 -64 32
-64 -64 -32
所以我希望一切都应该完全齐平。这是着色器:
attribute highp vec3 inVertex;
attribute highp vec3 inNormal;
attribute highp vec2 inTexCoord;
uniform highp mat4 ProjectionMatrix;
uniform highp mat4 ModelviewMatrix;
uniform highp mat3 ModelviewITMatrix;
uniform highp vec3 LightColor;
uniform highp vec3 LightPosition1;
uniform highp float LightStrength1;
uniform highp float LightStrength2;
uniform highp vec3 LightPosition2;
uniform highp float Shininess;
varying mediump vec2 TexCoord;
varying lowp vec3 DiffuseLight;
varying lowp vec3 SpecularLight;
void main()
{
// transform normal to eye space
highp vec3 normal = normalize(ModelviewITMatrix * inNormal);
// transform vertex position to eye space
highp vec3 ecPosition = vec3(ModelviewMatrix * vec4(inVertex, 1.0));
// initalize light intensity varyings
DiffuseLight = vec3(0.0);
SpecularLight = vec3(0.0);
// Run the directional light
PointLight(true, normal, LightPosition1, ecPosition, LightStrength1);
PointLight(true, normal, LightPosition2, ecPosition, LightStrength2);
// Transform position
gl_Position = ProjectionMatrix * ModelviewMatrix * vec4(inVertex, 1.0);
// Pass through texcoords and filter
TexCoord = inTexCoord;
}
最佳答案
我不知道你的盒子是如何绘制的 - 但我相信这就是问题所在。当计算每个盒子的顶点时,我猜你会做这样的事情(伪代码)
int i,j,k;float widhtfor i,j,k in dims: upper_left = (i,j,k)*width; upper_right = (upper_left.x+width,upper_left.y,upper_left.z); lower_left = (upper_left.x, upper_left.y+width,upper_left.z); lower_right = (upper_left.x+width,upper_left.y+width,upper_left.z);
这会失败,因为添加时会丢失精度,因此应该共享相同位置的角实际上不会。这就是造成差距的原因。
相反,你应该做这样的事情
for i,j,k: upper_left = (i,j,k)*width; upper_right = (i+1,j,k)*width; lower_left = (i,j+1,k)*width; lower_right = (i+1,j+1,k)*width;
这将确保角点使用相同的坐标。
编辑
这仍然是一个精度问题。据我了解,您正在对每个 block 执行一次绘制调用,其中每个 block 唯一更改的是 ModelviewMatrix。这意味着您期望这一行
位置 = ProjectionMatrix * ModelviewMatrix * vec4(inVertex, 1.0);
对于两个不同的 inVertex 和 ModelviewMatrix 值会给出相同的值,这是错误的。
要解决这个问题,您可以通过将每个实例的值保存在制服中并根据属性中给定的索引计算每个属性的值来进行“假”实例化(因为 ES 不支持实例化)。
编辑2:
好的,请暂时不要考虑“假”实例。现在,请确保坐标相同。因此,不要只为一个 block 提供坐标,而是为所有 block 提供坐标,并且只使用一个 ModelViewMatrix。这可能也会更快。
关于iphone - OpenGLES 2.0 : 3D Tile Visual Artifacts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7236980/
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我试图用这种形式简单地获取数字 28 integer+space+integer+integer+space+integer我试过这个正则表达式 \\s\\d\\d\\s 但我得到了两个数字11 和
最近一直在学习D语言。我一直对运行时感到困惑。 从我能收集到的关于它的信息中,(这不是很多)我知道它是一种有助于 D 的一些特性的运行时。像垃圾收集一样,它与您自己的程序一起运行。但是既然 D 是编译
想问一下这两个正则表达式有区别吗? \d\d\d 与 \d{3} 我已经在我的本地机器上使用 Java 和 Windows 操作系统对此进行了测试,两者都工作正常并且结果相同。但是,当在 linux
我正在学习 Go,而且我坚持使用 Go 之旅(exercise-stringer.go:https://tour.golang.org/methods/7)。 这是一些代码: type IPAddr
我在Java正则表达式中发现了一段令我困惑的代码: Pattern.compile( "J.*\\d[0-35-9]-\\d\\d-\\d\\d" ); 要编译的字符串是: String string
我在 ruby 代码上偶然发现了这个。我知道\d{4})\/(\d\d)\/(\d\d)\/(.*)/是什么意思,但是\1-\2-\3-\4 是什么意思? 最佳答案 \1-\2-\3-\4 是 b
我一直在努力解决这个问题,这让我很恼火。我了解 D 运行时库。它是什么,它做什么。我也明白你可以在没有它的情况下编译 D 应用程序。就像 XoMB 所做的那样。好吧,XoMB 定义了自己的运行时,但是
我有两个列表列表,子列表代表路径。我想找到所有路径。 List> pathList1 List> pathList2 当然是天真的解决方案: List> result = new ArrayList>
我需要使用 Regex 格式化一个字符串,该字符串包含数字、字母 a-z 和 A-Z,同时还包含破折号和空格。 从用户输入我有02-219 8 53 24 输出应该是022 198 53 24 我正在
目标是达到与this C++ example相同的效果: 避免创建临时文件。我曾尝试将 C++ 示例翻译为 D,但没有成功。我也尝试过不同的方法。 import std.datetime : benc
tl;dr:你好吗perfect forwarding在 D? 该链接有一个很好的解释,但例如,假设我有这个方法: void foo(T)(in int a, out int b, ref int c
有什么方法可以在 D 中使用abstract auto 函数吗? 如果我声明一个类如下: class MyClass { abstract auto foo(); } 我收到以下错误: mai
有没有人为内存中重叠的数组切片实现交集?算法在没有重叠时返回 []。 当 pretty-print (使用重叠缩进)内存中重叠的数组切片时,我想要这个。 最佳答案 如果您确定它们是数组,那么只需取 p
我已经开始学习 D,但我在使用 Andrei Alexandrescu 所著的 The D Programming Language 一书中提供的示例时遇到了一些麻烦。由于 int 和 ulong 类
如何创建一个不可变的类? 我的目标是创建一个实例始终不可变的类。现在我只是用不可变的方法和构造函数创建了一个“可变”类。我将其称为 mData,m 表示可变。然后我创建一个别名 alias immut
不久前我买了《The D Programming Language》。好书,很有教育意义。但是,我在尝试编译书中列出的语言功能时遇到了麻烦:扩展函数。 在这本书中,Andrei 写了任何可以像这样调用
我在 D http://www.digitalmars.com/d/2.0/lazy-evaluation.html 中找到了函数参数的惰性求值示例 我想知道如何在 D 中实现可能的无限数据结构,就像
这个问题在这里已经有了答案: 12 年前关闭。 Possible Duplicate: Could anyone explain these undefined behaviors (i = i++
当前是否可以跨模块扫描/查询/迭代具有某些属性的所有函数(或类)? 例如: source/packageA/something.d: @sillyWalk(10) void doSomething()
我是一名优秀的程序员,十分优秀!