OpenGL中的公告牌球体标签

OpenGL中的公告牌球体标签,opengl,glsl,Opengl,Glsl,我是OpenGL新手,所以这个问题可能相当愚蠢。 我正在尝试编写分子可视化工具。原子被渲染为球体贴图。它是根据标准实施的。标签渲染为从TrueType字体生成的位图纹理 顶点着色器的编写如下所示: #version 330 uniform mat4 Model; uniform mat4 Projection; in vec3 sphere_position; in float sphere_radius; in vec4 sphere_color; in vec2 texCoords

我是OpenGL新手,所以这个问题可能相当愚蠢。 我正在尝试编写分子可视化工具。原子被渲染为球体贴图。它是根据标准实施的。标签渲染为从TrueType字体生成的位图纹理

顶点着色器的编写如下所示:

#version 330

uniform mat4 Model;
uniform mat4 Projection;

in vec3  sphere_position;
in float sphere_radius;
in vec4  sphere_color;
in vec2  texCoords;

out vec4 color;
out vec2 TexCoords;

void main()
{

    vec4 real_coords = Model*vec4(sphere_position, 1.0);
    vec4 outer = 0.5*Projection*vec4(sphere_radius, sphere_radius, real_coords.z, 1.0);

    float apply = -outer.x/3;

    vec4 shift;
    switch(gl_VertexID % 4)
    {
    case 0:
        shift = vec4(-outer.x, -outer.y, apply, 0.);
        break;
    case 1:
        shift = vec4( outer.x, -outer.y, apply, 0.);
        break;
    case 2:
        shift = vec4( outer.x,  outer.y, apply, 0.);
        break;
    case 3:
        shift = vec4(-outer.x,  outer.y, apply, 0.);
        break;
    }

    TexCoords = texCoords;
    color = sphere_color;
    gl_Position = Projection*Model*vec4(sphere_position, 1.0) + shift;
}
片段着色器非常简单

#version 330

in vec4 color;
in vec2 TexCoords;

uniform sampler2D myTexture;


void main()
{
    gl_FragColor = vec4(1.0, 1.0, 1.0, texture(myTexture, TexCoords).r)*color;
}
问题如图所示

标签纹理覆盖圆柱体(请参见用蓝色标记)。这只是意味着我不能正确估计Z偏移。范围越广,变化就越大。乘数是经验性的

我的概念是在世界坐标系中找到球体的Z坐标

vec4 real_coords = Model*vec4(sphere_position, 1.0);
计算此Z坐标处的球体半径

Projection*vec4(sphere_radius, sphere_radius, real_coords.z, 1.0);
然后用它来换班。根据给定的图片,这种方法是不正确的。 我读过很多教程,但我的理解力受到数学和空间想象力的影响。 如何估计标签的正确偏移,使其始终位于球体的表面上,而不覆盖圆柱体的部分

在商业可视化工具中,标签的一切都很好(因为它工作得非常快,我假设球体也被渲染为冒名顶替者)


这与使用冒名顶替有点不同,但我倾向于使用真实球体。并使用正确的标签对球体进行纹理处理。然后旋转纹理或球体,使其始终面向摄影机。然后,当标签在前面时,其他几何体(如键)会覆盖标签。如果这会造成速度问题,我会非常惊讶;我的微薄的macbook集成gpu能够以比我想要的更快的速度渲染数十万个三角形。谢谢你的回复。我知道GPU现在可以毫无问题地渲染数千个三角形。我将尝试使用“真实”球体进行可视化。但很明显,每个原子约200个三角形原语比视点替用特效器的一个四元组要昂贵得多。上述冒名顶替者的问题仍未解决。如果我理解几何背景,我想这一定很容易解决。无论如何谢谢你!看起来这些广告牌需要很多古怪的数学运算,不可避免地很难调试和修改。但这并不意味着这是一个糟糕的解决方案。我没有与冒名顶替者打交道的经验,这就是为什么我建议了一个对我来说更干净的替代解决方案。我建议你用最坏的情况下的分子,计算出需要多少个三角形,然后用相同或更多的tris绘制一些东西,看看它有多灵敏。这会让你知道这是否是一个可行的解决方案(你可能会感到惊讶)。我还认为可以使用平滑着色技术将球体缩小到