我正在尝试为一些三维对象制作标签,用一个图标/三角形来显示对象的位置,再加上一些描述对象的文本。本质上,我想要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);
}