OpenGL中的广告牌球体标签

时间:2020-10-18 23:54:38

标签: opengl glsl

我是OpenGL的新手,所以问题可能很愚蠢。 我正在尝试编写分子可视化仪。原子呈现为SphereImpostors。它根据Lies and Impostors Tutorial实现。标签呈现为从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;
}

问题如图所示 enter image description here

标签纹理覆盖圆柱(请参见标记为蓝色)。这仅表示我无法正确估计Z偏移。进一步的领域是,必须有更大的转变。凭经验找到乘数。

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

vec4 real_coords = Model*vec4(sphere_position, 1.0);

计算此Z坐标处的球体半径

Projection*vec4(sphere_radius, sphere_radius, real_coords.z, 1.0);

,然后将其用作班次。根据给定的图片,这种方法是不正确的。 我已经阅读了很多教程,但是我的理解受到数学和空间想象力差的困扰。 如何估计标签始终位于球体表面且不覆盖圆柱体部分的正确偏移?

在商用可视化器中,使用标签一切都很好(因为它运行非常快,所以我认为球体也可以作为冒名顶替者。)

enter image description here

0 个答案:

没有答案
相关问题