在不使用glLineWidth的情况下绘制可变宽度线的最佳方法是什么?只画一个矩形?各种平行线?以上都不是?
在我的OpenGL应用程序中,它不会让我画一个大于十个像素宽的线.有没有办法让它绘制超过十个像素?
void OGL_Renderer::drawLine(int x, int y, int x2, int y2, int r, int g, int b, int a, int line_width)
{
glColor4ub(r, g, b, a);
glLineWidth((GLfloat)line_width);
glBegin(GL_LINES);
glVertex2i(x, y);
glVertex2i(x2, y2);
glEnd();
glLineWidth(1.0f);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个几何着色器来替换glLineWidth行为。我想绘制具有可自定义宽度的线条(现在使用统一的线条就足够了)。无论相机投影或与线条所在位置的距离如何,线条应始终具有相同的粗细。
基于大量的谷歌搜索,我想出了以下几何着色器:
#version 330
layout (lines) in;
layout (triangle_strip, max_vertices = 4) out;
uniform mat4 u_model_matrix;
uniform mat4 u_view_matrix;
uniform mat4 u_projection_matrix;
uniform float u_thickness = 4; // just a test default
void main()
{
float r = u_thickness / 2;
mat4 mv = u_view_matrix * u_model_matrix;
vec4 p1 = mv * gl_in[0].gl_Position;
vec4 p2 = mv * gl_in[1].gl_Position;
vec2 dir = normalize(p2.xy - p1.xy);
vec2 normal = vec2(dir.y, -dir.x);
vec4 offset1, offset2;
offset1 = vec4(normal * r, …Run Code Online (Sandbox Code Playgroud) 我有一个类似3D CAD的应用程序,我使用OpenGL包装器库(OpenSceneGraph).对于应用程序,我试图提出如何在3D中渲染粗细线条的最佳策略.
通过厚,光滑我的意思是:
10.f在我的机器上)
漂亮的库可以实现广泛的线条和曲线外观.它使用三角形进行渲染.
注意:我不寻求像顶点着色或类似笔刷的笔触这样的奇特效果,只是一个3D线段,它可以具有较大的厚度,并且与另一个线段连接良好,它们之间没有任何间隙.
这些2D方法的问题在于它们是2D.当我改变视点时,很明显我的线条几何形状不是线条,而是2D"条带"位于某些3D平面中.我希望它们看起来像3D线条.
在考虑问题时,我只能提出以下方法:
我不确定两种解决方案中的任何一种是否可行(我是OpenGL的初学者).我可能在场景中有数百甚至数千个折线.我也想知道是否有更好,更聪明的方法来解决这个问题?我对任何事情持开放态度,对最有效的方式感兴趣.谢谢.
编辑:正如用户@rickyviking指出的那样,我没有明确说明我正在寻找2D外观(就像任何类似CAD的应用程序一样),这意味着:线条的粗细不取决于距离的近/远相机就在他们身边.
更新:感谢@rickyviking的回答,我选择了方向移动 - 几何着色器.我仍然没有完整的解决方案,但可能会在结果发布后发布最终更新和最小代码.