相关疑难解决方法(0)

在openGL中绘制可变宽度线(无glLineWidth)

在不使用glLineWidth的情况下绘制可变宽度线的最佳方法是什么?只画一个矩形?各种平行线?以上都不是?

opengl

9
推荐指数
3
解决办法
2万
查看次数

OpenGL线宽

在我的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)

c++ opengl line

8
推荐指数
2
解决办法
2万
查看次数

GLSL 几何着色器替代 glLineWidth

我正在尝试编写一个几何着色器来替换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)

opengl glsl line geometry-shader

6
推荐指数
1
解决办法
5090
查看次数

OpenGL:3D中厚而光滑/不折断的线条*

我有一个类似3D CAD的应用程序,我使用OpenGL包装器库(OpenSceneGraph).对于应用程序,我试图提出如何在3D中渲染粗细线条的最佳策略.

通过厚,光滑我的意思是:

  • 线条粗细可以超过OpenGL最大线宽值(它似乎10.f在我的机器上)
  • 在组成折线时,我想避免看到"折线"(见下面的示例图片)

OpenGL <code>GL_LINE_STRIP_ADJACENCY</code>.</p>

<p>我发现有很多不同的资源可以在2D中渲染漂亮的线条和曲线.最简单的方法是不需要太多思考就是将该行渲染为一组四边形(<code>GL_QUAD_STRIP</code>).这个解决方案的好处是它同时解决了我的两个问题.</p>

<p>作为一个例子,我还发现这个<a rel=漂亮的库可以实现广泛的线条和曲线外观.它使用三角形进行渲染.

注意:我不寻求像顶点着色或类似笔刷的笔触这样的奇特效果,只是一个3D线段,它可以具有较大的厚度,并且与另一个线段连接良好,它们之间没有任何间隙.

这些2D方法的问题在于它们是2D.当我改变视点时,很明显我的线条几何形状不是线条,而是2D"条带"位于某些3D平面中.我希望它们看起来像3D线条.

在考虑问题时,我只能提出以下方法:

  1. 将线渲染为一组2D四边形(三角形),然后使它们始终面向相机
  2. 使用像圆柱体这样的3D形状来表示线段

我不确定两种解决方案中的任何一种是否可行(我是OpenGL的初学者).我可能在场景中有数百甚至数千个折线.我也想知道是否有更好,更聪明的方法来解决这个问题?我对任何事情持开放态度,对最有效的方式感兴趣.谢谢.

编辑:正如用户@rickyviking指出的那样,我没有明确说明我正在寻找2D外观(就像任何类似CAD的应用程序一样),这意味着:线条的粗细不取决于距离的近/远相机就在他们身边.

更新:感谢@rickyviking的回答,我选择了方向移动 - 几何着色器.我仍然没有完整的解决方案,但可能会在结果发布后发布最终更新和最小代码.

opengl glsl openscenegraph

2
推荐指数
2
解决办法
2354
查看次数

标签 统计

opengl ×4

glsl ×2

line ×2

c++ ×1

geometry-shader ×1

openscenegraph ×1