处理中点/笔划的景深着色器

2024-02-23

最近我一直在使用下面的景深着色器(最初来自ofx后处理 https://github.com/neilmendoza/ofxPostProcessing/blob/master/src/DofPass.cppOpenFrameworks 库)用于我的处理草图。

深度.glsl

uniform float maxDepth;

void main() {
  float depth = gl_FragCoord.z / gl_FragCoord.w;
  gl_FragColor = vec4(vec3(1.0 - depth/maxDepth), 1.0);
}

dof.glsl

uniform sampler2D texture;

varying vec4 vertexture;
varying vec4 vertTexCoord;

uniform sampler2D tDepth;

uniform float maxBlur; // max blur amount
uniform float aperture; // aperture - bigger values for shallower depth of field

uniform float focus;
uniform float aspect;

void main() {
    vec2 vUv = vertTexCoord.st;

    vec2 aspectcorrect = vec2( 1.0, aspect );

    vec4 depth1 = texture2D( tDepth, vUv );

    float factor = depth1.x - focus;

    vec2 dofblur = vec2 ( clamp( factor * aperture, -maxBlur, maxBlur ) );

    vec2 dofblur9 = dofblur * 0.9;
    vec2 dofblur7 = dofblur * 0.7;
    vec2 dofblur4 = dofblur * 0.4;

    vec4 col = vec4( 0.0 );

    col += texture2D( texture, vUv.xy );
    col += texture2D( texture, vUv.xy + ( vec2( 0.0, 0.4 ) * aspectcorrect ) * dofblur );
    col += texture2D( texture, vUv.xy + ( vec2( 0.15, 0.37 ) * aspectcorrect ) * dofblur );
    col += texture2D( texture, vUv.xy + ( vec2( 0.29, 0.29 ) * aspectcorrect ) * dofblur );
    col += texture2D( texture, vUv.xy + ( vec2( -0.37, 0.15 ) * aspectcorrect ) * dofblur );
    col += texture2D( texture, vUv.xy + ( vec2( 0.40, 0.0 ) * aspectcorrect ) * dofblur );
    col += texture2D( texture, vUv.xy + ( vec2( 0.37, -0.15 ) * aspectcorrect ) * dofblur );
    col += texture2D( texture, vUv.xy + ( vec2( 0.29, -0.29 ) * aspectcorrect ) * dofblur );
    col += texture2D( texture, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur );
    col += texture2D( texture, vUv.xy + ( vec2( 0.0, -0.4 ) * aspectcorrect ) * dofblur );
    col += texture2D( texture, vUv.xy + ( vec2( -0.15, 0.37 ) * aspectcorrect ) * dofblur );
    col += texture2D( texture, vUv.xy + ( vec2( -0.29, 0.29 ) * aspectcorrect ) * dofblur );
    col += texture2D( texture, vUv.xy + ( vec2( 0.37, 0.15 ) * aspectcorrect ) * dofblur );
    col += texture2D( texture, vUv.xy + ( vec2( -0.4, 0.0 ) * aspectcorrect ) * dofblur );
    col += texture2D( texture, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur );
    col += texture2D( texture, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur );
    col += texture2D( texture, vUv.xy + ( vec2( 0.15, -0.37 ) * aspectcorrect ) * dofblur );

    col += texture2D( texture, vUv.xy + ( vec2( 0.15, 0.37 ) * aspectcorrect ) * dofblur9 );
    col += texture2D( texture, vUv.xy + ( vec2( -0.37, 0.15 ) * aspectcorrect ) * dofblur9 );
    col += texture2D( texture, vUv.xy + ( vec2( 0.37, -0.15 ) * aspectcorrect ) * dofblur9 );
    col += texture2D( texture, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur9 );
    col += texture2D( texture, vUv.xy + ( vec2( -0.15, 0.37 ) * aspectcorrect ) * dofblur9 );
    col += texture2D( texture, vUv.xy + ( vec2( 0.37, 0.15 ) * aspectcorrect ) * dofblur9 );
    col += texture2D( texture, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur9 );
    col += texture2D( texture, vUv.xy + ( vec2( 0.15, -0.37 ) * aspectcorrect ) * dofblur9 );

    col += texture2D( texture, vUv.xy + ( vec2( 0.29, 0.29 ) * aspectcorrect ) * dofblur7 );
    col += texture2D( texture, vUv.xy + ( vec2( 0.40, 0.0 ) * aspectcorrect ) * dofblur7 );
    col += texture2D( texture, vUv.xy + ( vec2( 0.29, -0.29 ) * aspectcorrect ) * dofblur7 );
    col += texture2D( texture, vUv.xy + ( vec2( 0.0, -0.4 ) * aspectcorrect ) * dofblur7 );
    col += texture2D( texture, vUv.xy + ( vec2( -0.29, 0.29 ) * aspectcorrect ) * dofblur7 );
    col += texture2D( texture, vUv.xy + ( vec2( -0.4, 0.0 ) * aspectcorrect ) * dofblur7 );
    col += texture2D( texture, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur7 );
    col += texture2D( texture, vUv.xy + ( vec2( 0.0, 0.4 ) * aspectcorrect ) * dofblur7 );

    col += texture2D( texture, vUv.xy + ( vec2( 0.29, 0.29 ) * aspectcorrect ) * dofblur4 );
    col += texture2D( texture, vUv.xy + ( vec2( 0.4, 0.0 ) * aspectcorrect ) * dofblur4 );
    col += texture2D( texture, vUv.xy + ( vec2( 0.29, -0.29 ) * aspectcorrect ) * dofblur4 );
    col += texture2D( texture, vUv.xy + ( vec2( 0.0, -0.4 ) * aspectcorrect ) * dofblur4 );
    col += texture2D( texture, vUv.xy + ( vec2( -0.29, 0.29 ) * aspectcorrect ) * dofblur4 );
    col += texture2D( texture, vUv.xy + ( vec2( -0.4, 0.0 ) * aspectcorrect ) * dofblur4 );
    col += texture2D( texture, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur4 );
    col += texture2D( texture, vUv.xy + ( vec2( 0.0, 0.4 ) * aspectcorrect ) * dofblur4 );

    gl_FragColor = col / 41.0;
    gl_FragColor.a = 1.0;
}

DOF 效果非常适合像这样的基元BOX or SPHERE(请参阅后面的示例草图)但不幸的是,在显示时不起作用POINT and STROKE(每个点的模糊量相同,无论它们距离相机有多远)。

我认为这与点和笔画无法用颜色着色器控制这一事实有关,但不能肯定地说,因为我对着色器总体来说还是新手。

问题:

  • 是否可以调整上面的着色器以使其与点/笔画一起工作,或者我是否必须为这些特定基元使用/编写完全不同的景深着色器?
  • 如果可以进行简单的调整,您能帮我弄清楚我必须添加/修改什么才能使其与点一起使用吗?

任何建议将不胜感激。

谢谢

示例草图(需要Python模式+PeasyCam库)

add_library('peasycam')
colors, liste = [[0,189,202], [251,183,0], [255,17,79], [252,128,35], [0,108,254]], []

def setup():
    global depthShader, dofShader, cam, buf1, buf2, buf3, pnt
    size(900, 900, P3D)
    frameRate(1000)

    cam = PeasyCam(this, 900)
    cam.setMaximumDistance(width)
    pnt = createShape(BOX, 30)
    pnt.setStroke(False)

    depthShader, dofShader = loadShader("depth.glsl"), loadShader("dof.glsl")
    depthShader.set("maxDepth", cam.getDistance()*2)
    dofShader.set("aspect", width / float(height)), dofShader.set("maxBlur", 0.02), dofShader.set("aperture", 0.06)

    buf1, buf2, buf3 = [createGraphics(width, height, P3D) for e in range(3)]
    buf1.smooth(8), buf2.shader(depthShader), buf3.shader(dofShader)

    for e in range(300): liste.append(PVector(random(width), random(height), random(width))) 

def drawScene(pg):
    pg.beginDraw()
    pg.background(0)
    for i in range(len(liste)):
        pg.pushMatrix()
        pg.translate(liste[i].x-width/2, liste[i].y-width/2, liste[i].z-width/2)
        pg.shape(pnt)
        pnt.setFill(color(colors[i%5][0], colors[i%5][1], colors[i%5][2]))
        pg.popMatrix()
    pg.endDraw()
    cam.getState().apply(pg)

def draw():
    drawScene(buf1) 
    drawScene(buf2)

    buf3.beginDraw()
    dofShader.set("tDepth", buf2)
    dofShader.set("focus", map(mouseX, 0, width, .3, 1))
    buf3.image(buf1, 0, 0)
    buf3.endDraw()

    cam.beginHUD()
    image(buf3, 0, 0)
    cam.endHUD()

None

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

处理中点/笔划的景深着色器 的相关文章

  • Unity3D - 用于精灵裁剪的着色器

    我正在尝试创建一个可用于在游戏中剪辑 2D 精灵的着色器 我在中找到了该着色器另一个问题 https stackoverflow com questions 16397023 unity3d a shader that will clip
  • 从普通图像创建鱼眼效果的算法

    我正在尝试创建一个 OpenGL 片段着色器 将普通图像转换为包含鱼眼效果的图像 这就是我所说的鱼眼效果 http www marcofolio net photoshop create a fish eye lens effect in
  • int gl_VertexID 导致 Three.js 出错

    我一直在使用内置顶点索引的 gl VertexID 时遇到问题 通过使用in 与 Three js 一起使用 我不知道为什么 因为文档说它适用于所有版本的 OpenGL http www opengl org sdk docs mangls
  • 禁用 GLSL 编译器优化

    我正在使用 OpenGL 4 2 和 GLSL 420 我需要防止 GLSL 编译器优化未使用的制服 因为这些制服用于偶尔的测试 我尝试过 version 420 pragma optimize off 但它似乎没有效果 编译器仍然清除所有
  • 一般问题:着色语言/着色器是面向对象的吗?

    我目前正在接受学徒培训 其中一位培训师说 着色器是面向对象的 作为面向对象编程的示例 对我来说 这意味着 HLSL 和 GLSL 是面向对象的语言 我从来没有认为着色器是面向对象的 但现在当我看到这个时 https www khronos
  • 粒子系统的点精灵

    点精灵是构建粒子系统的最佳选择吗 新版本的 OpenGL 和最新显卡的驱动程序中是否存在点精灵 或者我应该使用 vbo 和 glsl 来做到这一点 点精灵确实非常适合粒子系统 但它们与 VBO 和 GLSL 没有任何关系 这意味着它们是完全
  • Android - 处理构建未编译

    我在 IDE 处理方面遇到问题 我正在尝试将一些东西编译到Android 上 当然 我使用的是 Android 模式 但我在编译时收到此错误 这不是代码本身 我已经安装了 adb devices 看起来没问题 我已经完成了所有 51 and
  • 如何绘制存储在 SSBO 中的顶点?

    这是下面的一个问题OpenGL 和加载 读取 AoSoA 混合 SoA 格式的数据 https stackoverflow com questions 59616117 opengl and loading reading data in
  • 如何在C++中实现向量混合?

    struct vec2 union struct float x y struct float r g struct float s t vec2 vec2 float a float b x a y b struct vec3 union
  • GLSL 版本变更日志?

    我可以在哪里阅读有关 GLSL 从版本 1 1 到 1 2 以及从 1 2 到 1 3 所做的更改和添加的信息吗 谷歌似乎对此不知所措 我真的不想开始阅读完整的规范 1 3版 http www opengl org registry doc
  • 处理随机建筑绘图窗口问题

    我重新发布此内容是因为我第一次发布此内容时代码不正确 我已经把所有的事情都记下来了 看起来像这样 但它应该看起来像这样 任何帮助使窗户与建筑物对齐都会很棒 因为我对此很陌生 谢谢 int buildingHeights new int 12
  • Three.js - 在自定义几何体上平滑兰伯特材质着色的问题

    我在 Three js 中创建了一个自定义几何体 现在 我想创建一个使用平滑阴影兰伯特材质的网格 使用循环 我创建了顶点数组 然后创建了面 然后我调用了 geometry computeCentroids geometry computeF
  • OpenGL - 固定管线着色器默认值(使用着色器模仿固定管线)

    谁能给我提供类似于固定功能管道的着色器 我最需要默认的片段着色器 因为我在网上找到了类似的顶点着色器 但如果你有一双应该没问题 我想使用固定管道 但具有着色器的灵活性 因此我需要类似的着色器 以便我能够模仿固定管道的功能 非常感谢 我是新来
  • 几何着色器中的宽线表现得很奇怪

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

    问题在于 伪影出现在距离很远的阴影中 我想尝试制作一个对数深度缓冲区 但我不明白应该在哪里完成以及如何完成 我对全向阴影贴图使用点光源方法 顶点着色器 version 460 core layout location 0 in vec3 a
  • 如何使用 Java 访问 Kinect?

    我目前正在学习计算机视觉课程 对于我的期末项目 我将制作一款与 Kinect 交互的小游戏 现在我想用 Java 制作这个游戏 因为我以前从未真正尝试过制作游戏 而且我对这种语言非常满意 但我似乎找不到一种方法来访问深度数据 我只需要将其打
  • 如何创建一个 numpy 数组来描述三角形的顶点?

    我喜欢使用 Numpy 创建要传递到的顶点数组glsl Vertices将是一个包含 3 个顶点信息的 numpy 数组 Each vertex包括 pos x y 具有 32 位的 64 位有符号浮点格式 R 分量位于字节 0 3 中 3
  • 如何快速将一个float打包为4个字节?

    我一直在寻找一种在 WebGL 纹理上存储浮动的方法 我找到了一些解决方案 http aras p info blog 2009 07 30 encoding floats to rgba the final 在互联网上 但那些只处理 0
  • OpenGL 将着色器附加到程序

    有没有办法访问附加到程序的着色器 也就是说 给定一个程序 我可以做类似的事情 vertexShader getVertexShaderFromProgram program 我想在验证我的程序的函数中记录着色器编译状态 但我只保留对程序的引
  • 为什么在处理.org java pdf 导出时只显示一个框?

    下面是我的代码 在运行时它显示了我想要的多个框 但是当我尝试导出时 它只在该帧位置显示一个框 我尝试在特定帧生成输出 但它有同样的问题 import processing pdf int ofs 500 boolean record voi

随机推荐

  • 使用 Javascript 的 Chromeless 播放器中的全屏选项?

    我正在使用 Youtube Javascript API 来开发 chromeless 播放器 你能告诉我如何在播放器上使用 Javascript 添加 开发 全屏控制 吗 YouTube api 中当前不存在此内容 相反 您可以使用 ja
  • 如何每年自动更改年龄

    我写了这个程序 但我有一个变量 年龄 我该如何做才能不必每年改变狗的年龄 换句话说 它应该自动改变 你应该保存生日 而不是保存年龄 这样可以在需要时计算年龄
  • ng2-charts + 如何自定义X轴标签的位置?

    我在用着https valor software com ng2 charts https valor software com ng2 charts 用于生成以下图表 Expected Graph Actual Graph Right n
  • Jest&material-ui:如何测试特定图标的存在?

    我最近将一个应用程序迁移到我喜欢的 mui v4 还完成了更新我们使用 jest enzyme 运行的测试套件 例如我现在喜欢mount代替shallow 一个问题是我找不到一种方法来测试图标的存在 在撰写本文时 我正在使用所有最新版本的m
  • 如何在进程结束后自动关闭`qemu`的执行?

    我想要的是qemu打开并显示输出后的窗口运行后自动关闭pintOS 就像我运行命令时一样pintos run alarm multiple in tcshshell qemu 显示过程开始 然后一些alarm notifications然后
  • 无法找到 ASP.NET CodeDom 提供程序错误

    我在服务器上部署时遇到 ASP NET 错误 无法找到 CodeDom 提供程序类型 Microsoft CodeDom Providers DotNetCompilerPlatform CSharpCodeProvider Microso
  • 如何使用 LaunchDaemons (launchd) 启动 Program.app?

    我放置了以下内容com apple test plist文件夹中的文件 系统 库 LaunchDaemons
  • 跨服务器SQL

    我想将数据从一台服务器的数据库移植到另一台服务器的数据库 这两个数据库都位于不同的 mssql 2005 服务器上 复制可能不是一个选项 因为目标数据库是按 时间间隔 从头开始生成的 我最好会做类似的事情 insert from db1 t
  • 如何使用 Razor 引擎在 MVC 5 项目上添加日期选择器 Bootstrap 3?

    我需要一些关于如何安装的指南日期选择器 http eternicode github io bootstrap datepicker 使用 Razor 引擎的 MVC 5 项目上的 Bootstrap 3 我找到了这个链接here http
  • Matplotlib Figsize 不受尊重[重复]

    这个问题在这里已经有答案了 我想用 matplotlib 绘制一个正方形图 也就是说 我希望整个图形是正方形的 当我使用以下代码时 生成的图像的宽度仍然比高度大一点 为什么 matplotlib 不尊重我提供的 Figsize import
  • 当我们有客户端会话时,为什么需要 JWT?

    据我所知 JWT 是无状态令牌 它存储有关客户端声明的签名信息 并通过授权 HTTP 标头传递到服务器 我的问题是 当我们已经有了客户端会话时 为什么还需要 JWT https github com mozilla node client
  • 将数字转换为时间

    如何将数字 1 33408564814814 转换为时间 32 01 05 如果您确实想要结果作为字符串 您可以使用如下函数 set serveroutput on format wrapped declare function days
  • HDFS 文件系统的 URL

    我在 HDFS 中有一些数据 user Cloudera Test 我可以通过运行很好地查看记录hdfs dfs cat Test 现在同一个文件 我需要在 scala 中将其读取为 RDD 我在 scala shell 中尝试了以下操作
  • 如何在pyspark中将DenseMatrix转换为spark DataFrame?

    除了以下使用 Scala 的示例之外 我没有找到任何 pyspark 代码将矩阵转换为 Spark 数据帧 有谁知道如何使用 python 代替 如何将 mllib 矩阵转换为 Spark 数据帧 https stackoverflow c
  • Activity.finish() 已调用,但 Activity 仍加载在内存中

    当我在调试器上运行我的应用程序时 我得到主线程和 3 个活页夹线程 单击按钮 我拨打电话Activity finish 看起来它会在 UI 关闭并返回主屏幕时结束 Activity 但是 在调试器中 它仍然将主线程和 3 个绑定器线程显示为
  • 如何在AWS Lambda中加载npm模块?

    我使用基于 Web 的编辑器创建了多个 Lambda 函数 到目前为止 一切都很好 我现在想开始使用模块扩展这些模块 例如 Promise 的 Q 我不知道如何将模块发送到 Lambda 以便我的函数可以使用它们 我已读完在 AWS Lam
  • 在项目中使用同一 DLL 的不同版本

    在我的项目中我必须使用不同版本的AWSSDKdll的 为了做到这一点我采取了帮助这个帖子 https stackoverflow com questions 2460542 using different versions of the s
  • SQL 将字符串(日期或文本)转换为日期

    我有一个数据库 其中有一列名为stringNextDue包含日期 英国格式 和文本 例如 逾期 已完成 等数据 我正在尝试创建一个视图 显示从现在起一个月内到期的课程 WHERE CONVERT DATETIME mt stringNext
  • Excel 97-2003 (.xls) 中的单元格样式丢失或不显示

    我正在使用 Apache POI 库将数据导出到 Excel 我已经尝试了所有最新版本 3 17 4 1 2 和 5 2 1 我在使用 Excel 97 xls 格式时遇到与单元格样式相关的问题 在一定数量的列之后 单元格样式会以某种方式丢
  • 处理中点/笔划的景深着色器

    最近我一直在使用下面的景深着色器 最初来自ofx后处理 https github com neilmendoza ofxPostProcessing blob master src DofPass cppOpenFrameworks 库 用