OpenGL 3.1 中已弃用 glLineStipple

2024-05-20

glLineStipple在最新的 OpenGL API 中已被弃用。 它被替换成什么? 如果不更换,怎样才能达到类似的效果呢? (我当然不想使用兼容性配置文件......)


抱歉,它还没有被任何东西取代。我想到的第一个模拟它的想法是几何着色器。您向几何着色器提供一条线,计算其屏幕空间长度,并基于此在其起始顶点和结束顶点之间生成可变数量的子线。


EDIT:也许您还可以使用带有 alpha(或红色)通道的 1D 纹理,将图案编码为 0.0(无线)或 1.0(线),然后让线纹理坐标从 0 到 1,并在片段 Chader 中创建一个简单的 alpha 测试,丢弃 alpha 低于某个阈值的片段。您可以方便几何着色器生成线条 texCoords,否则每条线条都需要不同的顶点。通过这种方式,您还可以使 texCoord 依赖于线条的屏幕空间长度。

如果你绘制三角形(使用多边形模式),整个事情就会变得更加困难GL_LINE)。然后,您必须在几何着色器中自己进行三角形线转换,放入三角形并输出直线(这也可能是将来弃用多边形模式的一个原因,如果还没有的话)。


EDIT:尽管我相信这个问题已经被放弃,但我已经为第二种方法制作了一个简单的着色器三元组。这只是一个最小的解决方案,您可以随意添加自定义功能。我没有测试过它,因为我缺乏必要的硬件,但你应该明白这一点:

uniform mat4 modelViewProj;

layout(location=0) in vec4 vertex;

void main()
{
    gl_Position = modelViewProj * vertex;
}

顶点着色器是一个简单的传递。

layout(lines) in;
layout(line_strip, max_vertices=2) out;

uniform vec2 screenSize;
uniform float patternSize;

noperspective out float texCoord;

void main()
{
    vec2 winPos0 = screenSize.xy * gl_in[0].gl_Position.xy / gl_in[0].gl_Position.w;
    vec2 winPos1 = screenSize.xy * gl_in[1].gl_Position.xy / gl_in[1].gl_Position.w;
    gl_Position = gl_in[0].gl_Position;
    texCoord = 0.0;
    EmitVertex();
    gl_Position = gl_in[1].gl_Position;
    texCoord = 0.5 * length(winPos1-winPos0) / patternSize;
    EmitVertex();
}

在几何着色器中,我们取一条线并计算其屏幕空间长度(以像素为单位)。然后我们通过点画图案纹理的大小来划分它,这将是factor*16当模拟调用时glLineStipple(factor, pattern)。这被视为第二条线端点的一维纹理坐标。

请注意,该纹理坐标必须进行线性插值(noperspective插值说明符)。通常的透视校正插值会导致点画图案“挤在一起”在线的较远部分,而我们明确地使用屏幕空间值。

uniform sampler1D pattern;
uniform vec4 lineColor;

noperspective in float texCoord;

layout(location=0) out vec4 color;

void main()
{
    if(texture(pattern, texCoord).r < 0.5)
        discard;
    color = lineColor;
}

片段着色器现在仅使用图案纹理中的值执行简单的 Alpha 测试,其中 1 表示线条,0 表示无线条。因此,要模拟固定功能点画,您将拥有 16 像素 1 分量 1D 纹理,而不是 16 位图案。不要忘记将图案的环绕模式设置为GL_REPEAT,关于过滤模式我不太确定,但我想GL_NEAREST将是一个好主意。

但如前所述,如果你想使用渲染三角形glPolygonMode,这样就行不通了。相反,您必须调整几何着色器以接受三角形并为每个三角形生成 3 条线。


EDIT:事实上,OpenGL 3 对着色器中整数运算的直接支持使我们能够完全放弃整个 1D 纹理方法,并直接使用实际的位模式进行工作。因此,几何着色器稍微改变以输出实际的屏幕尺寸图案坐标,而不进行标准化:

texCoord = 0.5 * length(winPos1-winPos0);

在片段着色器中,我们只需将位模式作为无符号整数(尽管 32 位与glLineStipple的 16 位值)和图案的拉伸因子,只需将纹理坐标(好吧,实际上不再有纹理,但没关系)模 32 来获取它在图案上的位置(那些明确的uints 很烦人,但是我的 GLSL 编译器说之间存在隐式转换int and uint是邪恶的):

uniform uint pattern;
uniform float factor;

...
uint bit = uint(round(linePos/factor)) & 31U;
if((pattern & (1U<<bit)) == 0U)
    discard;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL 3.1 中已弃用 glLineStipple 的相关文章

  • 渲染缓冲区大于窗口大小 - OpenGL

    我正在尝试绘制大于屏幕尺寸 即 320x480 的渲染缓冲区 512x512 执行 glReadPixels 后 图像看起来是正确的 除非图像的尺寸超过了屏幕尺寸 在本例中 超过了水平 320 和垂直 480 是什么原因导致这种异常现象呢
  • 丢弃对 OpenGL 中的程序性能有影响吗?

    我正在读书this http code google com p gdc2011 android opengl wiki TalkTranscript文章 作者写道 以下是如何通过两个简单的步骤在每个平台上编写高性能应用程序 遵循最佳实践
  • 如何在 RichTextBox C# 中显示行号

    我正在制作一个带有代码突出显示的简单文本和脚本编辑器 为此 我使用 RichTextBox 但我不知道如何让它在左侧显示行号 就像在 VS 或 Notepad 中一样 有什么解决办法吗 我尝试重新使用其他地方引用的 codeproject
  • 创建并使用我自己的纹理图集的 mipmap

    我目前正在使用自动 mipmap 生成 C OpenTK GL GenerateMipmap GenerateMipmapTarget Texture2D 我使用的纹理平铺为 16px 的块 所以我的问题是 是否可以使用不会缩小至 1x1
  • matplotlib:渲染到缓冲区/访问像素数据

    我想使用 matplotlib 生成的图作为 OpenGL 中的纹理 到目前为止 我遇到的 matplotlib 的 OpenGL 后端要么不成熟 要么已经停止使用 所以我想避免使用它们 我当前的方法是将图形保存到临时 png 文件中 并从
  • 具有交错缓冲区的 openGL glDrawElements

    到目前为止 我只使用了 glDrawArrays 并希望转向使用索引缓冲区和索引三角形 我正在绘制一个有点复杂的对象 其中包含纹理坐标 法线和顶点坐标 所有这些数据都收集到一个交错的顶点缓冲区中 并使用类似于以下的调用进行绘制 假设所有血清
  • GPU-android opengl es 3.0中的亮度直方图计算

    用于亮度直方图计算 我使用了 Brad Larson 的 GPU image ios 项目中的代码 他使用混合进行直方图计算 连接顶点和片段着色器 顶点着色器 version 300 es in vec4 position out vec3
  • Three.js、自定义着色器和具有透明度的 png 纹理

    我有一个非常简单的 PNG 纹理 一个带有透明背景的灰色圆圈 我用它作为制服map for a THREE ShaderMaterial var uniforms THREE UniformsUtils merge basicShader
  • 在着色器中旋转法线

    我有一个场景 其中有多个具有各自位置和旋转的模型 给定法线 着色器对每个像素应用简单的双向照明 那是我的顶点着色器 version 150 in vec3 position in vec3 normal in vec2 texcoord o
  • OpenGL纹理渲染与原始不匹配

    我正在尝试使用 OpenGL 渲染纹理 我用作测试的纹理是白色背景上的一堆黑色矩形 如下所示 然而 在渲染时 纹理似乎被复制并叠加在其自身之上多次 我使用以下方法设置场景 std string vertexSource ShaderLoad
  • 如何在片段着色器中将 gl_FragCoord 转换为世界空间点?

    我的理解是 如果您有视图投影矩阵 屏幕宽度和屏幕高度的逆矩阵 则可以将 gl FragCoord 转换为片段着色器中世界坐标中的点 首先 你转换gl FragCoord x and gl FragCoord y通过分别除以宽度和高度 然后将
  • iPhone glShader二进制

    有谁有如何编译着色器 保存着色器二进制文件以及使用 glShaderBinary 稍后使用 iPhone iOS OpenGL ES 2 0 加载着色器的示例 这是不可能的 至少对于 iOS 4 及更低版本 iOS 不支持任何预编译的二进制
  • OpenGL 缓冲区、glFlush 和 glutSwapBuffers()

    使用之间有什么区别吗 glutInitDisplayMode GLUT SINGLE GLUT RGB with glFlush and glutInitDisplayMode GLUT DOUBLE GLUT RGB with glutS
  • SDL 程序中颜色关闭

    我目前正在开发一个非常简单的游戏 使用纯 C 方法和 SDL 及其官方额外库 如 SDL image 和 OpenGL 现在 虽然我遇到了一些障碍 但我不知道为什么要这样做 绘制时颜色全部关闭 我目前在 Mac 上运行该程序 但如果我没记错
  • Vim 插入模式下光标线颜色变化

    有一个很好的片段可以改变光标颜色 if term xterm rxvt use an orange cursor in insert mode let t SI
  • OpenGL 新手: glutMouseFunc

    我试图在单击鼠标后更改球体位置 但在使用 glutMouseFunc 中的 x 和 y 时它不起作用 以下是代码 include stdafx h include
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前
  • Libgdx SpriteBatch.draw() 指定 4 个顶点

    我正在使用 libGdx 创建一个 2d 游戏 并尝试使用这个特殊的方法来绘制一个简单的 2d 纹理 分别指定 4 个顶点 draw Texture texture float spriteVertices int offset int l
  • 线性/非线性纹理映射扭曲的四边形

    In my 上一个问题 https stackoverflow com questions 10832909 quad strip texturing distortion 已经确定 当对四边形进行纹理化时 面被分解为三角形 并且纹理坐标以

随机推荐

  • PHP - 类外 use 关键字和类内 use 关键字的区别

    伙计们 美好的一天 只是想问一下有什么区别use之外的class and use在 的里面class 我也用谷歌搜索过 但我的问题与答案不匹配 Example namespace App Http Controllers Auth use
  • 如何将udp发送到udp node.js服务器?

    我对此很陌生 所以我真的不知道我在做什么 但我已经设置了一个 node js udp 服务器 我想从客户端 来自网站 向它发送一个数据包 但我不知道如何在 javascript 中做到这一点 或者是否可能 我不是在研究如何从 Node js
  • 类型错误:描述符“__weakref__”不适用于父级 __str__ 方法中的对象

    我有一个父类 我们称之为A还有一堆儿童班 B C D等等 我想定义一个 str 父类及其内部的方法我想通过访问子类的成员dir self 它有效 但是当我检查该名称是否可调用时callable getattr self attr I get
  • 如何使用 MySQL 选择有特定值的 2 个连续行?

    我正在构建一个系统 该系统应该显示学生何时连续缺席两天 例如 此表包含缺勤情况 day id missed 2016 10 6 1 true 2016 10 6 2 true 2016 10 6 3 false 2016 10 7 1 tr
  • 多处理:仅使用物理核心?

    我有一个函数foo它消耗大量内存 我想并行运行多个实例 假设我有一个有 4 个物理核心的 CPU 每个核心有两个逻辑核心 我的系统有足够的内存来容纳 4 个实例foo并行但不是 8 个 此外 由于这 8 个核心中的 4 个是逻辑核心 我也不
  • 如何让 list() 消耗 __iter__ 而不调用 __len__ ?

    我有一堂课 有两个 iter and a len 方法 后者使用前者来计算所有元素 它的工作原理如下 class A def iter self print iter for in range 5 yield something def l
  • MySQL:@@ 是什么意思?

    我正在阅读本页上的 MySQL 文档 http dev mysql com doc refman 5 1 en set statement html http dev mysql com doc refman 5 1 en set stat
  • 如何公开具有 OData 服务的派生类和成员的多层模型?

    我正在尝试公开一个可供使用的模型OData服务 我目前采取的方法是 1 在模型中定义一个类来公开IQueryable集合例如 public class MyEntities public IQueryable
  • Android 上有哪些字体可用? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道安卓有一个字体集合 http www ascenderfonts com store search
  • 拥有更多列或更多行会更高效吗?

    我目前正在重新设计一个可能包含大量数据的数据库 我可以选择在数据库中包含许多不同的列或使用大量行 如果我在下面做一些大纲 可能会更容易 item id user id title description content category t
  • 与其他图标相比,AppCompat ShareActionProvider 图标太大

    我将 ActionBarSherlock 更改为 AppCompat v7 我已经完成了使其工作所需的所有更改 但是共享图标 使用 ShareActionProvider 发生了一些奇怪的情况 与其他图标相比 共享图标太大 我还使用支持库进
  • OleLoadPicturePath 是否已以非向后兼容的方式更改?

    我最近遇到一个问题 我能够在一台 PC 上将图标添加到 VB6 表单 它运行良好 但他们无法在第二台 PC 上运行 编译它 结果发现图标文件是 32 位的 包括 Alpha 通道 这就是问题所在 但令我惊讶的是 这是一个依赖于系统的功能 在
  • 重定向到 Angular2 中 @CanActivate 内的不同组件

    有什么方法可以重定向到 Angular2 中的 CanActivate 不同的组件吗 截至今天 使用最新的 angular router 3 0 0 rc 1 这里有一些关于如何通过以下方式做到这一点的参考 CanActivate路线守卫
  • 在 R 上安装 TDA 包时出错:目标“diag.o”的配方失败

    使用 Ubuntu 16 04 和 R 3 4 1 安装 R 包 TDA 时收到错误消息 它似乎与制作 CGAL diag cpp 和 或 diag o 最后的完整错误打印输出 有关 我仔细看了这个 在 R 上安装 TDA 包时出错 htt
  • library_private_types_in_public_api 和 StatefulWidget

    将 linter 升级到新版本后 flutter lints 2 0 1 在我的 pubspec 中 linter 启用此规则 公共 API 中的库私有类型 https dart dev tools linter rules library
  • 如何确保整数除法始终向上舍入?

    我想确保如有必要 整数除法总是向上舍入 还有比这更好的方法吗 目前正在进行大量选角工作 int Math Ceiling double myInt1 myInt2 更新 这个问题是我2013年1月博客的主题 http ericlippert
  • 使用 PHP PayPal REST API 退款?

    我正在开发一个集成到 PayPal 的 REST API 中的 PHP 应用程序 我正确处理了事务并将事务 ID 保存到 MySQL 数据库中 我现在正在尝试退款 但无法让它停止给出 传入 JSON 请求未映射到 API 请求 错误 有人对
  • 使用 DigitalOcean 在 Kubernetes 集群上为我的 Nginx-Ingress 生成通配符证书

    我遵循了这个 DigitalOcean 指南https www digitalocean com community tutorials how to set up an nginx ingress with cert manager on
  • 为什么 SBCL eval 函数会丢失它运行的宏?

    print x 打印出我想要评估的内容 但是 eval x 失败了 但如果我运行 x 它就可以了 我缺少什么 请告诉我为什么这不起作用 或者我是否在做一些愚蠢的事情 我正在尝试打印动态大小的表并设置 lambda 变量以最终计算表中每个单元
  • OpenGL 3.1 中已弃用 glLineStipple

    glLineStipple在最新的 OpenGL API 中已被弃用 它被替换成什么 如果不更换 怎样才能达到类似的效果呢 我当然不想使用兼容性配置文件 抱歉 它还没有被任何东西取代 我想到的第一个模拟它的想法是几何着色器 您向几何着色器提