是否可以确保对于远处的物体,在 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 个像素?的主要内容,如果未能解决你的问题,请参考以下文章

初识OpenGL (-)多级渐远纹理(Mipmap)

初识OpenGL (-)多级渐远纹理(Mipmap)

GJM:Unity开发HTC vive 远处拖动3D物体 转载

在 Auto Scaling 组中,确保在给定的可用区中至少有一个 ec2 实例始终可用

OpenGL纹理映射总结

OPenGL学习