OpenGL中的公告牌球体标签
我是OpenGL新手,所以这个问题可能相当愚蠢。 我正在尝试编写分子可视化工具。原子被渲染为球体贴图。它是根据标准实施的。标签渲染为从TrueType字体生成的位图纹理 顶点着色器的编写如下所示: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
#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绘制一些东西,看看它有多灵敏。这会让你知道这是否是一个可行的解决方案(你可能会感到惊讶)。我还认为可以使用平滑着色技术将球体缩小到