几何着色器中的宽线表现得很奇怪

2024-04-11

我正在尝试使用几何着色器渲染任意宽线(在屏幕空间中)。乍一看似乎一切都很好,但在某些视图位置上,线条渲染不正确:

左侧图像呈现正确的渲染(正 X、Y 和 Z 轴上的三条线,2 像素宽)。

当相机移动到原点附近(实际上靠近线条)时,线条会像正确的图像一样渲染。着色器看起来很简单,但我不明白我的 GPU 上发生了什么:

--- Vertex Shader

#version 410 core

// Modelview-projection matrix
uniform mat4 ds_ModelViewProjection;
// Vertex position
in vec4 ds_Position;
// Vertex color
in vec4 ds_Color;

// Processed vertex color
out vec4 ds_VertexColor;

void main()
{    
    gl_Position = ds_ModelViewProjection * ds_Position;

    ds_VertexColor = ds_Color;
}

--- Geometry Shader

    #version 410 core

    // Viewport size, in pixels
uniform vec2 ds_Viewport;
// Line width, in pixels
uniform float ds_LineWidth = 2.0;
// Processed vertex color (from VS, in clip space)
in vec4 ds_VertexColor[2];
// Processed primitive vertex color
out vec4 ds_GeoColor;

layout (lines) in;
layout (triangle_strip, max_vertices = 4) out;

void main()
{
    vec3 ndc0 = gl_in[0].gl_Position.xyz / gl_in[0].gl_Position.w;
    vec3 ndc1 = gl_in[1].gl_Position.xyz / gl_in[1].gl_Position.w;

    vec2 lineScreenForward = normalize(ndc1.xy - ndc0.xy);
    vec2 lineScreenRight = vec2(-lineScreenForward.y, lineScreenForward.x);
    vec2 lineScreenOffset = (vec2(ds_LineWidth) / ds_ViewportSize) * lineScreenRight;

    gl_Position = vec4(ndc0.xy + lineScreenOffset, ndc0.z, 1.0);
    ds_GeoColor = ds_VertexColor[0];
    EmitVertex();

    gl_Position = vec4(ndc0.xy - lineScreenOffset, ndc0.z, 1.0);
    ds_GeoColor = ds_VertexColor[0];
    EmitVertex();

    gl_Position = vec4(ndc1.xy + lineScreenOffset, ndc1.z, 1.0);
    ds_GeoColor = ds_VertexColor[1];
    EmitVertex();

    gl_Position = vec4(ndc1.xy - lineScreenOffset, ndc1.z, 1.0);
    ds_GeoColor = ds_VertexColor[1];
    EmitVertex();

    EndPrimitive();
}

--- Fragment Shader

// Processed primitive vertex color
in vec4 ds_GeoColor;

// The fragment color.
out vec4 ds_FragColor;

void main()
{
        ds_FragColor = ds_GeoColor;
}

你的错误在于:

gl_Position = vec4(ndc0.xy + lineScreenOffset, ndc0.z, 1.0 /* WRONG */);

要解决这个问题:

vec4 cpos = gl_in[0].gl_Position;
gl_Position = vec4(cpos.xy + lineScreenOffset*cpos.w, cpos.z, cpos.w);

您所做的是:丢失有关 W 的信息,从而使 HW 限幅器失谐,将其从 3D 限幅器降级为 2D 限幅器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

几何着色器中的宽线表现得很奇怪 的相关文章

  • 如何快速将一个float打包为4个字节?

    我一直在寻找一种在 WebGL 纹理上存储浮动的方法 我找到了一些解决方案 http aras p info blog 2009 07 30 encoding floats to rgba the final 在互联网上 但那些只处理 0
  • 如何以编程方式在 qml 中渲染 vtk 项目?

    到目前为止 我了解到我们在 QML 中有两个线程 我们的主应用程序线程和我们的 场景图 线程 http doc qt io qt 5 qtquick visualcanvas scenegraph html http doc qt io q
  • 在 OpenGL 中,为什么 glVertexAttribPointer 要求“指针”参数以 void* 形式传入?

    规格为glVertexAttribPointer如下 void glVertexAttribPointer GLuint index GLint size GLenum type GLboolean normalized GLsizei s
  • glutPostRedisplay 不在循环内工作

    我试图让一个人在 y 轴上跳跃 所以我使用 2 秒的循环 第一秒它应该向下移动并弯曲膝盖 第二秒它应该向上移动 然后在起始位置完成 现在我刚刚开始让这个人在第一秒内跪下并弯曲膝盖 我还没有编写动画的其余部分 问题是 glutPostRedi
  • OpenGL 和加载/读取 AoSoA(混合 SoA)格式的数据

    假设我有以下 AoSoA 格式的简化结构来表示顶点或点 struct VertexData float px 4 position x float py 4 position y 也就是说 每个实例VertexData存储4个顶点 我见过的
  • openGL转png

    我正在尝试将包含大量纹理 没有移动 的 openGL 编辑 我画的卡片 thx unwind 转换为一个 PNG 文件 我可以在框架的另一部分中使用该文件我正在与 有 C 库可以做到这一点吗 thanks 如果您的意思只是 获取由 Open
  • 如何将点光源转换为卵形/椭圆形?

    我希望通过具有不同 x 和 y 值的 vec2 半径将当前的圆形光变成椭圆形 有没有办法根据我当前在片段着色器中的代码来做到这一点 uniform struct Light vec4 colour vec3 position vec2 ra
  • 简单的线框格式?

    我正在寻找一种用于线框模型的简单文件格式 我知道 VRML u3D 等 但这些对于我的需求来说似乎很重要 我的标准是 必须有明确的规格 要么是开放的 要么是非常完善 记录的 我只需要 想要 简单的模型 顶点和边 我不想处理面孔或物体 如果格
  • 使用未声明的标识符“gl_InstanceID”

    大家好 我一直在IOS平台上尝试在OpenGLES2 0中进行实例化绘制 我的渲染代码 glEnableVertexAttribArray glVertexAttribPointer glDrawElementsInstancedEXT G
  • 将像素传递给 glTexImage2D() 后会发生什么?

    例如 如果我创建一个像素数组 如下所示 int getPixels int pixels new int 10 pixels 0 1 pixels 1 0 pixels 1 1 etc glTexImage2D getPixels glTe
  • 使用draw()而不是eventloop时的pyglet

    我正在尝试用 pyglet 画一个圆 但当我使用 draw 函数而不是 app run 循环时 它是不可见的 有什么建议我可以做什么吗 谢谢 from math import from pyglet gl import window pyg
  • 解决 Three.js / webGL 中的 gl_PointSize 限制

    我正在使用 Three js 创建交互式数据可视化 此可视化涉及渲染 68000 个节点 其中每个不同的节点具有不同的大小和颜色 最初我尝试通过渲染网格来实现此目的 但事实证明这非常昂贵 我当前的尝试是使用 Three js 粒子系统 每个
  • SDL 鼠标位置调整大小后裁剪

    我在 SDL 中的鼠标位置上遇到了一些奇怪的行为 如果我将窗口大小调整得更大 则任一鼠标事件的 x y 位置似乎都限制为原始窗口的宽度和高度 如果我缺少一些函数调用来告诉 SDL 鼠标区域的大小已增加 应用程序的相关部分 void Resi
  • 如果我用opengl绘图的话SDL Renderer就没用了吗?

    我正在学习 SDL2 但我也在使用使用 OpenGL 调用的 imgui 库 从我在网上各种博客上读到的内容来看 我无法轻松混合 SDL2 渲染器和 opengl 调用 我要么使用其中之一 要么使用另一个 我读过的大多数教程都使用渲染器 所
  • 为什么OpenGL使用float而不是double? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • PyQt5 的 OpenGL 模块和版本控制问题(调用不正确的 _QOpenGLFunctions_(ver))

    我一直在努力得到PyQt5 helloGL 示例代码 https github com baoboa pyqt5 blob master examples opengl hellogl py编译 当我尝试构建解决方案时 我得到 Traceb
  • 无法在 WSL2 上运行 OpenGL

    我尝试在 WSL2 上运行 OpenGL 代码 但在尝试运行可执行文件时出现以下错误 GLFW error 65543 GLX Failed to create context GLXBadFBConfig Unable to create
  • OpenGL ES 2.0 中的纹理点?

    我正在尝试在 OpenGL ES 2 0 中为粒子系统实现纹理点 例如点精灵 我遇到的问题是所有点都渲染为实心黑色方块 而不是正确映射纹理 我已经验证 gl PointCoord 实际上返回从 0 0 到 1 0 的 x y 值 这将映射到
  • 将四元数旋转转换为旋转矩阵?

    基本上 给定一个四元数 qx qy qz qw 我如何将其转换为OpenGL旋转矩阵 我也对哪个矩阵行是 向上 向右 向前 等感兴趣 我有一个四元数的相机旋转 我需要在向量中 以下代码基于四元数 qw qx qy qz 其中顺序基于 Boo
  • OpenGL - 两个纹理的幂

    OpenGL 使用二次幂纹理 这是因为由于 MipMapping 某些 GPU 只接受 2 的幂纹理 当绘制比实际更大的纹理时 使用这些二次方纹理会导致问题 我想到了一种方法来解决这个问题 即仅在我们使纹理小于实际大小时使用 PO2 比率

随机推荐

  • 正确使用 Scala 特征和 case 对象

    为了掌握 Scala 类和特征的窍门 这里有一个简单的例子 我想定义一个指定各种操作的类 可以通过多种方式实现 我可以从以下开始 sealed trait Operations def add def multiply 例如 我可能会用一个
  • Windows 批处理脚本中的 URL 编码

    我有一个 Windows 批处理脚本 用于快速进行 Google 搜索 但是 我不知道如何对特殊字符进行一般编码 就像我尝试搜索 C 一样 井号会破坏它 这是我的代码 SET q https www google com q SET q q
  • Laravel Blade 使用自定义函数

    我有一个刀片 用于打印表格的内容 对于某些列 我需要根据要打印的值添加 CSS 类 例如 如果 OK 则添加绿色类 否则添加红色类 当然逻辑会更复杂 但重点是所有逻辑都会与风格相关 哪一个是保存此类函数 方法的最佳推荐位置 我需要创建模型吗
  • 如何在 Android 中以编程方式关闭“询问使用 WLAN”?

    我将收到 一个应用程序请求使用 WLAN 的权限 允许吗 当我尝试更改 WiFi 状态时 Android 5 1 真实手机三星 SM J5008 中的提示窗口 我有谷歌一些信息 例如https groups google com d msg
  • 在哪里可以找到 /usr/include/X11/extensions/Xcomposite.h

    我需要将我的应用程序放在全屏视频上并捕获它以放入我的 python tkinter 应用程序中的 画中画 框架中 我回顾了通常的嫌疑人 图像抓取 mss等 但它们似乎都只是抓取监视器上可见的内容 似乎没有人能够抓住一扇看不见的窗户 我在以下
  • 将变量内容复制到事实中后,Ansible 会抛出错误

    我有变量 其中包含带有其他模板引擎标记的字符串 不幸的是它们是三个花括号 如果我直接使用这些变量 一切都很好 如果我将它们复制到事实中以便随后修改它们 Ansible 会抛出错误 示例剧本 hosts localhost connectio
  • 如何使用对象模型获取 SharePoint 版本

    通过 WSSv2 SharePoint 2003 您可以获得您正在使用的 SharePoint 版本 e g SPGlobalAdmin 版本 http msdn microsoft com en us library microsoft
  • 在 SQL Server Management Studio(2005 或更高版本)中连接不同的 Windows 用户

    SQL Server Management Studio 2005 或更高版本 中是否有办法更改 Windows 身份验证用户 就像在 SQL Server 2000 及更早版本中一样 这是常规连接属性对话框 请注意选择 Windows A
  • 在模型序列化器中获取当前用户

    是否可以在模型序列化器中获取当前用户 我希望这样做而不必脱离泛型 因为这是一项必须完成的简单任务 我的型号 class Activity models Model number models PositiveIntegerField bla
  • 在 Recyclerview 出现之前对其进行测量

    我目前在测量 recyclerView 出现之前遇到问题 我需要测量的高度才能启动 展开 动画 这是我之前在我正在处理的代码中为 gridView 完成的 我正在尝试使用 GridLayoutManager 将其迁移到 RecyclerVi
  • 每组具有最大值的行 - SQLite

    给定一个表columns name lat lon population type 每行有很多行name 我想选择按以下分组的行name where 人口是最高的 如果我仅限于姓名和人口 则以下内容有效 SELECT name Max po
  • 在 React 中逐个字母地“打印”字符串

    我有一个 React Native 组件 需要显示一个带有逐个字母打印的字符串字母的动画 因此 从逻辑上讲 我需要在循环内更新 React 状态挂钩 以 1 秒的间隔将字符串的每个字符附加到其中 到目前为止我所拥有的是 let placeh
  • 在android中以编程方式覆盖文本转语音设置中的“始终使用我的设置”选项

    某些平板电脑具有覆盖应用程序文本转语音设置的选项 名为 文本转语音设置中的 始终使用我的设置 如果选中此选项 则 TTS 引擎将选取 TTS 的用户设置 而不是特定于应用程序的设置 我的要求是 每当我的应用程序使用 TTS 引擎时 应始终使
  • Hibernate + Informix + Blob + 字节数组

    我在将字节数组保存到 Informix 数据库时遇到问题 我将向您展示我是如何尝试的 在 Fichero java 中 我有以下内容 Column name fichero columnDefinition blob private byt
  • 今天 iPad 的扩展高度比指定的要大得多

    我的今日扩展需要根据小部件显示的内容具有动态高度 我可以通过在最底部元素上添加约束来实现此目的 底部布局指南的顶部小于或等于最底部元素的底部 常数为 0 优先级为 999 乘数为 1 这与 iPhone 上的预期完全一样 小部件高度适合所有
  • 舍入到列表中最接近的任意数字

    我基本上是在寻找一种方法来做一些变化这个 Ruby 脚本 https stackoverflow com questions 3160502 ruby round number down to nearest number based on
  • Meteor 如何访问服务器端和客户端的 Facebook Graph Api

    脸书账户 https atmospherejs com meteor accounts facebook包仅提供登录和注销功能 流星fbgraph https github com stevezhu meteor fbgraph允许访问服务
  • Rails 3 和嵌套 jQuery 文件上传模型

    有没有人有关于使用嵌套属性让 jQuery 文件上传插件与 Rails 一起使用的建议 示例 我的模型 has many 附件并接受必要的嵌套属性 我想让它与 jQuery 文件上传一起使用 但还没有找到任何好的例子来帮助我开始 有没有人取
  • 带有 varargs 的 Julia @evalpoly 宏

    我正在尝试使用 Julia 的 evalpoly宏 当我手动提供系数时它可以工作 但我一直无法弄清楚如何通过数组提供这些系数 julia gt VERSION v 0 3 5 julia gt evalpoly 0 5 1 2 3 4 3
  • 几何着色器中的宽线表现得很奇怪

    我正在尝试使用几何着色器渲染任意宽线 在屏幕空间中 乍一看似乎一切都很好 但在某些视图位置上 线条渲染不正确 左侧图像呈现正确的渲染 正 X Y 和 Z 轴上的三条线 2 像素宽 当相机移动到原点附近 实际上靠近线条 时 线条会像正确的图像