是否可以确保对于远处的物体,在 OpenGL 中至少渲染 1 个像素?
Posted
技术标签:
【中文标题】是否可以确保对于远处的物体,在 OpenGL 中至少渲染 1 个像素?【英文标题】:Is it possible to ensure that, for distant objects, at least 1 pixel is rendered in OpenGL? 【发布时间】:2017-08-14 04:42:57 【问题描述】:我正在编写一个太阳系模拟,有些物体要么太远要么太小,甚至无法渲染到单个像素。这种行为是意料之中的,但它正在创建一些工件。对于小的摄像机移动,对象会在渲染到单个像素和根本不渲染之间交替,从而产生“闪烁”伪影。
是否可以强制一个对象总是被渲染到至少 1 个像素?或者可能有任何其他技术来避免这个问题。
调用时问题依旧
glDepthFunc(GL_ALWAYS)
最远的物体距离相机 4412 个单位,而最远的平面距离相机 10000 个单位。
使用来自this answer 的代码渲染的对象是球体(行星),具有 36 个扇区和 36 个环,球体的绘制调用是
glDrawElements(GL_QUADS, m_Indices.size(), GL_UNSIGNED_SHORT, (void *)0)
下面列出了使用的着色器:
顶点着色器
#version 330 core
layout(location = 0) in vec3 in_Position;
layout(location = 1) in vec3 in_Normal;
layout(location = 2) in vec2 in_TexCoord;
uniform mat4 un_mvpMatrix;
out vec2 TexCoord;
void main()
gl_Position = un_mvpMatrix * vec4(in_Position, 1.0);
TexCoord = in_TexCoord;
片段着色器
#version 330 core
in vec2 TexCoord;
uniform sampler2D in_Texture;
out vec4 FragColor;
void main()
FragColor = texture(in_Texture, TexCoord);
【问题讨论】:
@Rabbid76 我已经用相关信息编辑了问题,以供您发表评论。 @Rabbid76 因为我正在处理太阳系模拟,所以对象是球体。该问题再次使用相关信息进行更新。我只是在着色器中进行定位和纹理映射。 这是 OpenGL 光栅化规则的结果。你可以看看淡化物体,这对于漫反射器是有意义的,或者你可能有类似GL_NV_conservative_raster
扩展的东西。
另一种解决方案是使用多重采样/超级采样。
【参考方案1】:
在一个通道中为每个对象在其中心绘制GL_POINTS
,然后在另一个通道顶部绘制 3D 几何图形。这样一来,即使 3D 几何图形消失,您也始终掌握要点。
【讨论】:
以上是关于是否可以确保对于远处的物体,在 OpenGL 中至少渲染 1 个像素?的主要内容,如果未能解决你的问题,请参考以下文章
GJM:Unity开发HTC vive 远处拖动3D物体 转载