在 glsl es 2.0、Gamemaker Studio 2.0 中获取渐变平方的问题

2023-12-09

我制作了一个包含 4 个三角形的三角形列表,中间点的颜色不同。然后目标是组合三角形以获得漂亮的渐变。 但是三角形的边缘会产生不需要的线条,我不希望这些线条我希望它一直平滑。 我怎样才能得到想要的结果?

Images: Unwanted lines

着色器代码:

    // Simple passthrough vertex shader
    //
    attribute vec3 in_Position;                  // (x,y,z)
    attribute vec4 in_Colour;                    // (r,g,b,a)
    attribute vec2 in_TextureCoord;              // (u,v)

    varying vec2 v_texcoord;
    varying vec4 v_colour;

    void main()
    {
        vec4 object_space_pos = vec4( in_Position.x, in_Position.y,         in_Position.z, 1.0);
        gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;

        v_colour = in_Colour;
        v_texcoord = in_TextureCoord;
    }

    //
    // Simple passthrough fragment shader
    //
    varying vec2 v_texcoord;
    varying vec4 v_colour;

    void main()
    {
        gl_FragColor = v_colour;
    }

游戏制作者代码: 创建事件:

    //Build vertices list


    vertex_format_begin();
    vertex_format_add_position();
    vertex_format_add_colour();
    vertex_format_add_textcoord();
    v_format = vertex_format_end();
    v_buff = vertex_create_buffer();
    vertex_begin(v_buff, v_format);

    //triangle 0
    vertex_position(v_buff, 200, 100);
    vertex_colour(v_buff, c_black, 1);
    vertex_texcoord(v_buff, 0.0, 0.0);

    vertex_position(v_buff, 600, 100);
    vertex_colour(v_buff, c_black, 1);
    vertex_texcoord(v_buff, 1.0, 0.0);

    vertex_position(v_buff,  400, 300);
    vertex_colour(v_buff, c_red, 1);
    vertex_texcoord(v_buff, 0.5, 0.5);

    //triangle 1
    vertex_position(v_buff, 200, 100);
    vertex_colour(v_buff, c_black, 1);
    vertex_texcoord(v_buff, 0.0, 0.0);

    vertex_position(v_buff, 200, 500);
    vertex_colour(v_buff, c_black, 1);
    vertex_texcoord(v_buff, 0.0, 1.0);

    vertex_position(v_buff,  400, 300);
    vertex_colour(v_buff, c_red, 1);
    vertex_texcoord(v_buff, 0.5, 0.5);

    //triangle 2
    vertex_position(v_buff, 600, 100);
    vertex_colour(v_buff, c_black, 1);
    vertex_texcoord(v_buff, 1.0, 0.0);

    vertex_position(v_buff, 600, 500);
    vertex_colour(v_buff, c_black, 1);
    vertex_texcoord(v_buff, 1.0, 1.0);

    vertex_position(v_buff,  400, 300);
    vertex_colour(v_buff, c_red, 1);
    vertex_texcoord(v_buff, 0.5, 0.5);

    //triangle 3
    vertex_position(v_buff, 200, 500);
    vertex_colour(v_buff, c_black, 1);
    vertex_texcoord(v_buff, 0.0, 1.0);

    vertex_position(v_buff, 600, 500);
    vertex_colour(v_buff, c_black, 1);
    vertex_texcoord(v_buff, 1.0, 1.0);

    vertex_position(v_buff,  400, 300);
    vertex_colour(v_buff, c_red, 1);
    vertex_texcoord(v_buff, 0.5, 0.5);

    vertex_end(v_buff);
    tex = sprite_get_texture(sprite_index, 0);

抽奖活动:

    shader_set(shd_prim);
    shader_set_uniform_f(uni_radius, var_radius);
    vertex_submit(v_buff, pr_trianglelist, tex);
    shader_reset();

你看到的效果是视错觉。您可以通过对颜色进行分级来使其可见。为此,请使用以下片段着色器:

varying vec2 v_texcoord;
varying vec4 v_colour;

void main()
{
    float steps   = 4.0;
    //float steps   = 8.0;
    //float steps   = 16.0;
    //float steps   = 32.0;

    vec3 gradColor = floor(v_colour.rgb * steps) / steps;
    gl_FragColor   = vec4(gradColor, 1.0);
}

4 种颜色:

enter image description here

8 种颜色:

enter image description here

16 种颜色:

enter image description here

32 种颜色:

enter image description here


为了获得更好的结果,你必须在片段着色器中计算颜色。以下着色器平滑地更改渐变,从视图中间的圆形渐变到视图边界的方形渐变。片段颜色是插值形式color1 to color2,使用GLSLmix功能。

varying vec2 v_texcoord;
varying vec4 v_colour;

void main()
{
    vec4 color1 = vec4(1.0, 0.0, 0.0, 1.0);
    vec4 color2 = vec4(0.0, 0.0, 0.0, 1.0);

    vec2 distV     = v_texcoord * 2.0 - 1.0;
    float maxDist  = max(abs(distV.x), abs(distV.y));
    float circular = length(distV);
    float square   = maxDist;

    gl_FragColor = mix(color1, color2, mix(circular,square,maxDist));
}

Preview:

enter image description here

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

在 glsl es 2.0、Gamemaker Studio 2.0 中获取渐变平方的问题 的相关文章

  • 如何检测android中某个渲染器区域内的触摸事件?

    在android中我举了一个旋转球体的例子在这里给出 https bitbucket org jimcornmell opengltexturedsphere 它创建了一个简单的应用程序 显示一个旋转球体 地球 现在 如果在手机显示屏上按下
  • 减少 OpenGL ES 1.1 中纹理的内存使用

    我在 OpenGL ES 中的场景需要几个大分辨率纹理 但它们是灰度的 因为我仅将它们用于蒙版 我需要减少内存使用 我尝试使用 Bitmap Config ALPHA 8 和 RGB 565 加载这些纹理 ALPHA 8 似乎实际上增加了内
  • GLSL - 计算表面法线

    我有一个用 GLSL 编写的简单顶点着色器 我想知道是否有人可以帮助我计算表面的法线 我正在 升级 一个平面 所以当前的灯光模型看起来 很奇怪 这是我当前的代码 varying vec4 oColor varying vec3 oEyeNo
  • 在 OpenGL ES 中绘制立方体需要多少个顶点?

    我在不同的在线站点中看到不同数量的顶点来表示 OpenGL ES 中的同一个立方体 例如 这是一个 float vertices width height depth 0 width height depth 1 width height
  • 在 Libgdx 中实现简单运动模糊的意外结果

    在所附的两张图片中 libgdx 的桌面屏幕截图按预期运行 不幸的是 我的 Galaxy Nexus 的屏幕截图与预期不符 我正在尝试创建一个简单的运动模糊或轨迹效果 Rendering as I expected on my deskto
  • 在 OpenGL ES 1.1 中将多个纹理绑定到一个网格

    如果我有一个网格 例如有 6 个面的立方体 每个面分别由 4 个顶点组成 总共 24 个顶点 并且我想对每个面应用不同的纹理 我该怎么做 目前 我使用 glDrawElements 一次绘制整个网格 立方体的所有 6 个面 将所有索引提供到
  • 使用 glDrawElements 时在 OpenGL 核心配置文件中选取三角形

    我正在使用 glDrawElements 绘制三角形网格 并且希望能够使用鼠标单击来拾取 选择三角形 三角形的网格可以很大 在固定功能 OpenGL 中 可以使用 GL SELECT http content gpwiki org inde
  • 如何将点光源转换为卵形/椭圆形?

    我希望通过具有不同 x 和 y 值的 vec2 半径将当前的圆形光变成椭圆形 有没有办法根据我当前在片段着色器中的代码来做到这一点 uniform struct Light vec4 colour vec3 position vec2 ra
  • LibGDX - 着色器适用于桌面但不适用于 Android

    我编写了一个简单的程序 可以在 3D 环境中渲染球体 并根据球体周围的四个光源为其着色 当我在桌面上运行该程序时 它工作得很好 但在 Android 设备上 球体只是纯色的 下面是一些图片来说明我正在谈论的内容 gt Desktop gt
  • 纹理不适用于网格 - OpenGL

    我正在使用 OpenGL Es 我已成功加载 obj 文件 网格 并且显示良好 但当我应用纹理时 它不显示 我添加了下面的代码 public void draw GL10 gl bind the previously generated t
  • 解决 Three.js / webGL 中的 gl_PointSize 限制

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

    我正在尝试在 OpenGL ES 2 0 中为粒子系统实现纹理点 例如点精灵 我遇到的问题是所有点都渲染为实心黑色方块 而不是正确映射纹理 我已经验证 gl PointCoord 实际上返回从 0 0 到 1 0 的 x y 值 这将映射到
  • 将自己的结构传递到 opengl es 2.0 着色器中

    我想尝试 OpenGL ES 2 0 编程指南 一书中的照明示例 在着色器中他们制作了两种结构 struct directional light vec3 direction normalized light direction in ey
  • -[EAGLContext renderbufferStorage:fromDrawable:] 第二次失败?

    我正在开发一个 iOS openGL ES 应用程序 我正在做通常的 EAGLView ES2Render 的事情 启动时 使用以下代码成功创建 frambuffer BOOL createFramebuffers EAGLContext
  • OpenGL ES 片段着色器显然不可能返回白色

    这是一个奇怪的现象 我有一个片段着色器 据我所知只能返回黑色或红色 但它将像素渲染为白色 如果我删除一根特定的线 它会返回我期望的颜色 它适用于 WebGL 但不适用于 Raspberry Pi 上的 OpenGL ES 这是着色器代码 如
  • 使用 JOGL 和 Android OpenGL 编写可移植 Java 应用程序

    我计划编写一款可以在 PC 和 Android 上运行的 Java 3D 游戏 不幸的是 这两个平台似乎没有通用的 OpenGL API API 是否有显着差异 有没有办法在两个版本中使用相同的 3D 代码 这是不是一个好主意 Androi
  • 对于某些纹理尺寸,glFramebufferTexture2D 在 iPhone 上失败

    当我尝试将纹理附加到帧缓冲区时 glCheckFramebufferStatus 报告某些纹理大小的 GL FRAMEBUFFER UNSUPPORTED 我已经在第二代和第四代 iPod Touch 上进行了测试 两个模型之间失败的纹理尺
  • OpenGL:伽玛校正图像看起来不线性

    我使用 OpenGL 进行渲染 当我将线性值写入默认帧缓冲区 没有任何伽玛校正 时 它们在我的显示器上显示为线性 这违背了我认为我所知道的关于伽马校正的一切 如下所述 http gamedevelopment tutsplus com ar
  • OpenGL (ES 2.0) 动态改变线宽

    我目前正在使用大量的工具绘制模型GL LINES全部在统一的半径内 我知道glLineWidth将改变半径all线 但它们各自应该有不同的半径 我想知道是否可以使用glLineWidth 以不同的方式 或其他功能 我还应该怎么做呢 将它们渲
  • Android 中的 OpenGL 缩小

    我正在使用 3D 对象并渲染它并通过扩展 GLSurfaceView 实现渲染器来显示它 问题是如何通过捏合和捏合进行缩小 下面是我的班级 package com example objLoader import java nio Byte

随机推荐

  • 满足特定要求的密码正则表达式

    我要编写一个正则表达式来满足以下要求 至少一个字符 至少一位数字 长度必须为 8 至少一个特殊字符 可以是任意特殊字符 前三个很简单 但找不到一种方法来限制至少特殊字符 任何可能的特殊字符 例如 gt etc 您可以通过组合前瞻来解决这些问
  • JavaScript 的客户端 DOM 打开重定向

    我在扫描以下代码时遇到客户端 DOM 打开重定向安全问题 问题出现在我初始化变量 myPath 和 myHost 的位置 我无法理解它如何受到网络钓鱼攻击以及如何修复它 有人可以帮忙吗 var query this value var my
  • Symfony Doctrine 找不到要加载的装置

    我从 Symfony 3 4 开始 但负载夹具有问题 当我执行时php bin console doctrine fixtures load然后我收到消息 In LoadDataFixturesDoctrineCommand php lin
  • PHP PDO 潜在的逻辑错误

    我是 PHP 新手 想知道为什么这段代码不向数据库插入任何内容 返回 0 我确信这一定是一个逻辑错误 因为我没有收到任何错误消息 class DbConnection protected db conn public db host loc
  • C# 线程问题

    我正在做的是从先前的按钮单击动态创建的列表视图 然后 ti 启动一个后台工作程序 其中应清除列表视图并每 30 秒用新信息填充 iistview 我不断得到 跨线程操作无效 从创建它的线程以外的线程访问控制 listView 2 priva
  • Numpy 广播

    下面的代码给出了 a 0 11 中的元素在数组 c 的第一行中出现了多少次 a c 0 我如何调整此代码 以便它对 c 中的所有行 而不仅仅是 c 0 执行相同的操作 本质上是一个for循环 import numpy as np c np
  • 通过测试 numpy 数组中的每个元素是否在 2 个数字之间创建布尔数组

    我有一个 numpy 数字数组 我想创建一个具有相同大小和维度的布尔数组 用于说明该元素是否位于两个数字之间 例如 a np array 1 2 3 4 5 6 7 8 9 我知道如果我写 print a gt 3 我得到一个数组 其中前三
  • AVAudioPlayer 不播放任何声音

    我正在开发一个 iOS 应用程序 需要使用AVFoundation框架 Xcode 4 中的工作区结构包含两个项目 Workspace 应用程序本身 主要项目 实用程序库 构建实用程序库后 会生成一个静态库 该静态库在主应用程序中用作框架
  • Numpy:最大值为 NaN

    我关于Python的问题真的很微不足道 我必须修改什么函数max 为任何编译器返回真实值 import numpy as np a np array 1 0 1 np nan The maximal value is 1 It is not
  • Excel VBA 中的多范围相交

    为什么这不起作用 我试图让 Excel 检查 B 列和 D 列中的任何更改 如果 B 列已更改 然后执行一些操作等 Private Sub Worksheet Change ByVal Target As Range Dim lc As L
  • 我可以使用 PHP 将 URL 变量传递给 IFrame 吗?

    我以前没有太多 或根本 使用过 PHP 我有以下代码 我认为应该可以采用 URL 变量并将其传递给 Iframe url 我的问题是 当我点击该页面时 它是打开的 而不是 http sitename com whats on ID 2 it
  • Build.scala 不是在运行中创建的

    我正在尝试学习游戏 正在做教程http www playframework com documentation 2 2 x ScalaTodoList 我遇到的问题是文件project Build scala 不是为我创建的 我应该手动创建
  • 事件触发的 Toast 通知 UWP

    想法 我正在为特定网络自动进行 wifi 登录 其中用户必须通过弹出诸如警报应用程序之类的 Toast 通知来输入凭据 但不是小睡或关闭按钮 而是登录或注销 问题 当用户连接到特定的 wifi 网络时 如何立即触发 toast 通知 您需要
  • 从 Python 调用 LibreOffice 时出错

    调用 LibreOffice 将文档转换为文本 这在 Linux 命令行中工作得很好 soffice headless convert to txt Text document to convert doc 但是当我尝试从 Python 运
  • Foreach 仅显示数组中的最后一项[重复]

    这个问题在这里已经有答案了 我试图创建一个 foreach 循环来迭代数组中的每个项目 但它只捕获最后一个项目 而不迭代第一个项目 我已经剥离了代码 仅显示相关部分 并添加了一些命令来识别问题 如上所述 message kk ll myAr
  • strip_tags() 和 mysqli_real_escape_string() 的安全性

    我正在参与一个关于信息安全的学校项目 其中一项作业是用 PHP 编写一些安全页面 我的小组中没有人了解 PHP 但这不是一个大问题 我们将学到足够的知识来创建所需的简单页面 学生助理给出的建议之一就是使用这两个函数strip tags an
  • Asp.Net MVC 5 中具有身份表和自定义表的多对多关系

    我正在尝试在 Asp Net Identity 生成的表中的用户与我自己的表之间建立关系 该关系必须是多对多 因为许多用户可以处理同一个任务 这是我的表 并且同一时间一个用户可以处理多个任务 public class Task public
  • 保持表单应用程序和 Windows 服务(或任何 n 层,实际上)之间的设置同步

    我有一个执行许多定期活动的 Windows 服务 并且我想从 Windows 窗体应用程序更改此服务的设置 不过 我不确定确保服务具有最新的用户首选项的最佳方法 运行频率 使用哪些文件夹 用户可以指定的其他内容 用户可以随时随意更改设置 我
  • 字体文件中的字体系列名称

    我有一个 ttf 文件 我想检索字体系列名称 通过导入 System Windows Media 命名空间可以最轻松地完成此操作 与从 ByteArray 中获取字体相比 这为您提供了更多的工作空间和更简单的 API using Syste
  • 在 glsl es 2.0、Gamemaker Studio 2.0 中获取渐变平方的问题

    我制作了一个包含 4 个三角形的三角形列表 中间点的颜色不同 然后目标是组合三角形以获得漂亮的渐变 但是三角形的边缘会产生不需要的线条 我不希望这些线条我希望它一直平滑 我怎样才能得到想要的结果 Images 着色器代码 Simple pa