用于三维对象的PyOpenGL恒定大小二维标签



我正在尝试为一些三维对象制作标签,用一个图标/三角形来显示对象的位置,再加上一些描述对象的文本。本质上,我想要1。使用pyopengl和2显示文本。让文本+图标在屏幕上保持不变的大小,可以3。仍然在屏幕上移动。

(我环顾四周,看了看正交投影,但我不确定这是我应该使用的…(

我根本没有怎么使用opengl,所以这可能是一个愚蠢的问题!任何帮助都将不胜感激。

一个不错的开始是将图标+文本存储在一个quad中。有很多关于";字体渲染";这将帮助您创建所需的四边形。

你可以在openGL纹理中加载你的图标,一旦完成,你就必须创建你的四边形,并将顶点和碎片着色器与之关联。困难的部分是为四边形设置一个固定的位置,它不会链接到你的3D场景。

在电子游戏中,当你想绘制ui或hud(healthbar、minimap(时,你可以在所有东西的顶部绘制它们。Thoose元素不需要mvp矩阵,也不需要您可能熟悉的投影矩阵。所有的魔法都将出现在顶点着色器中,他将负责设置所有元素的位置,顶点着色器的输出应该在所有坐标的[-1,1]范围内:

  • -1->左侧、顶部、附近
  • 1->右侧、底部、远处

我们称这个空间为ndc,见图https://antongerdelan.net/opengl/raycasting.html

您的工作将是输出此范围内的值。如果希望四边形的大小为宽度的一半,高度的四分之一,以中间为中心,则可以将此信息存储在发送到着色器的顶点中。

GLfloat vertices[] = {-0.5, -0.25, 0, // bottom left corner
-0.5,  0.25, 0, // top left corner
0.5,  0.25, 0, // top right corner  
0.5, -0.25, 0}; // bottom right corner

顶点着色器,人们可能会使用像素大小的四边形和正交投影

in vec3 pos;
in vec2 uv;
out fuv;
void main()
{
//glm::mat4 translation = uTranslation might need to mvoe the quad on screen at runtime
gl_Position = vec4(pos.x, pos.y, -1.0, 1.0); //set it to near plane -1
fuv = uv;
}

碎片着色器

in vec2 fuv;
out vec4 color;
uniform sampler2D renderedTexture;
void main(){
color = texture(renderedTexture, fuv);
}

最新更新