在opengl中将颜色应用于四边形中的单个顶点

2023-11-23

我正在尝试为绘制的四边形的单个顶点着色glDrawElements,我正在与cocos2d库,因此我能够清理源代码以准确了解发生了什么,代码如下:

glBindVertexArray( VAOname_ );
glDrawElements(GL_TRIANGLES, (GLsizei) n*6, GL_UNSIGNED_SHORT, (GLvoid*) (start*6*sizeof(indices_[0])) );
glBindVertexArray(0);

因此使用顶点数组对象。我正在尝试修改传递的对象的单个顶点颜色,它似乎可以工作,但有一个故障,如下图所示:

enter image description here

这里我尝试改变左下和右下顶点的颜色。结果是不同的,我想这是因为四边形被渲染为几个具有共享斜边的三角形,斜边位于从左下顶点到右上顶点的对角线上。所以这可能会导致不同的结果。

现在我也想得到第一个案例的第二个结果。有办法获取吗?


你的猜测是对的。 OpenGL 驱动程序将四边形细分为两个三角形,其中顶点颜色按重心插值,从而产生您所看到的结果。

解决此问题的常用方法是在片段着色器中“手动”执行插值,这会考虑目标拓扑(在您的情况下是四边形)。或者简而言之,您必须执行重心插值,而不是基于三角形,而是基于四边形。您可能还想应用透视校正。

我现在还没有准备好阅读手头的资源,但我会尽快更新这个答案(实际上可能意味着,我必须自己写)。

Update

首先我们必须理解这个问题:大多数 OpenGL 实现将较高的图元分解为三角形并将它们本地化,即无需进一步了解图元的其余部分,例如一个四边形。所以我们必须自己做这件事。

我就是这样做的。

#version 330 // vertex shader

当然我们还需要平时的制服

uniform mat4x4 MV;
uniform mat4x4 P;

首先我们需要这个着色器执行实例处理的顶点的位置

layout (location=0) in vec3 pos;

接下来我们需要一些顶点属性来描述四边形本身。这意味着它的角位置

layout (location=1) in vec3 qp0;
layout (location=2) in vec3 qp1;
layout (location=3) in vec3 qp2;
layout (location=4) in vec3 qp3;

和颜色

layout (location=5) in vec3 qc0;
layout (location=6) in vec3 qc1;
layout (location=7) in vec3 qc2;
layout (location=8) in vec3 qc3;

我们将它们放入变量中供片段着色器处理。

out vec3 position;
out vec3 qpos[4];
out vec3 qcolor[4];

void main()
{
    qpos[0] = qp0;
    qpos[1] = qp1;
    qpos[2] = qp2;
    qpos[3] = qp3;

    qcolor[0] = qc0;
    qcolor[1] = qc1;
    qcolor[2] = qc2;
    qcolor[3] = qc3;

    gl_Position = P * MV * position;
}

在片段着色器中,我们使用它来实现颜色分量的距离加权:

#version 330 // fragment shader

in vec3 position;
in vec3 qpos[4];
in vec3 qcolor[4];

void main()
{
    vec3 color = vec3(0);

以下可以简化组合,但为了清楚起见,我将其写出来: 对于顶点的每个角点,将所有角点的颜色与它们之间的边缘上的位置投影作为混合因子进行混合。

    for(int i=0; i < 4; i++) {
        vec3 p = position - qpos[i];
        for(int j=0; j < 4; j++) {
            vec3 edge = qpos[i] - qpos[j];
            float edge_length = length(edge);
            edge = normalize(edge);
            float tau = dot(edge_length, p) / edge_length;

            color += mix(qcolor[i], qcolor[j], tau);
        }
    }

由于我们对每个角点查看了 4 次,因此缩小了 1/4

    color *= 0.25;

    gl_FragColor = color; // and maybe other things.
}

我们快完成了。在客户端我们需要传递附加信息。当然我们不想重复数据。为此我们使用glVertexBindingDivisor这样顶点属性仅每 4 个顶点(即四边形)前进,在qp… and qc…位置,即位置 1 到 8

typedef float vec3[3];
extern vec3 *quad_position;
extern vec3 *quad_color;

glVertexAttribute(0, 3, GL_FLOAT, GL_FALSE, 0, &quad_position[0]);

glVertexBindingDivisor(1, 4);
glVertexAttribute     (1, 3, GL_FLOAT, GL_FALSE, 0, &quad_position[0]);

glVertexBindingDivisor(2, 4);
glVertexAttribute     (2, 3, GL_FLOAT, GL_FALSE, 0, &quad_position[1]);

glVertexBindingDivisor(3, 4);
glVertexAttribute     (3, 3, GL_FLOAT, GL_FALSE, 0, &quad_position[2]);

glVertexBindingDivisor(4, 4);
glVertexAttribute     (4, 3, GL_FLOAT, GL_FALSE, 0, &quad_position[3]);

glVertexBindingDivisor(5, 4);
glVertexAttribute     (5, 3, GL_FLOAT, GL_FALSE, 0, &quad_color[0]);

glVertexBindingDivisor(6, 4);
glVertexAttribute     (6, 3, GL_FLOAT, GL_FALSE, 0, &quad_color[1]);

glVertexBindingDivisor(7, 4);
glVertexAttribute     (7, 3, GL_FLOAT, GL_FALSE, 0, &quad_color[2]);

glVertexBindingDivisor(8, 4);
glVertexAttribute     (8, 3, GL_FLOAT, GL_FALSE, 0, &quad_color[3]);

将以上内容放入顶点数组对象是有意义的。使用 VBO 也是有意义的,但随后您必须手动计算偏移大小;因为typedef float vec3编译器为我们的 ATM 进行数学计算。

完成所有这些设置后,您最终可以独立地细分绘制您的四边形。

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

在opengl中将颜色应用于四边形中的单个顶点 的相关文章

  • 即使在顶点着色器中使用,glGetUniformLocation()也会返回-1

    我正在尝试用法线渲染一个简单的立方体 我使用以下代码来初始化着色器 void initShader const char vertexShaderPath const char fragmentShaderPath cout lt lt I
  • Ruby popen3 和 ANSI 颜色

    我试图让 watchr 在文件更改时自动运行测试 并获得了我需要的大部分工作 除了 RSpec 中的所有 ANSI 颜色都被忽略这一事实 违规代码如下 stdin stdout stderr Open3 popen3 cmd stdout
  • 不理解 gluOrtho2D 函数

    我不能做什么gluOrtho2D 函数是做什么的 是否将原点固定在 OpenGL 窗口上的某个特定点或其他位置 这是因为gluOrtho2D 1 1 1 1 将原点固定在窗口的中间 如果它在某个时刻没有修复原点 那么有什么方法可以修复原点
  • 如何为十六进制颜色字符串创建独立类型?

    我正在尝试在 TypeScript 中创建一个独立类型 可用于将单个有效的十六进制颜色代码表示为完全类型安全的字符串 我的尝试如下 但由于实际上不是独立类型而未能实现 而这正是我希望实现的目标 type HexDigit
  • 如何设置评分栏的星星颜色?

    如何设置评分栏的星星颜色 我想要黄色星星 最简单的方法 android progressTint color color 光滑有光泽
  • 简单的线框格式?

    我正在寻找一种用于线框模型的简单文件格式 我知道 VRML u3D 等 但这些对于我的需求来说似乎很重要 我的标准是 必须有明确的规格 要么是开放的 要么是非常完善 记录的 我只需要 想要 简单的模型 顶点和边 我不想处理面孔或物体 如果格
  • 使用 GLSL 着色器在同一片段着色器中定义的多个子例程类型无法正常工作

    我正在开发一个使用 GLSL 着色器的程序 我编写了 2 种不同的方法来用 2 种不同的方法计算 ADS 环境光 漫反射 镜面反射 着色 为了正确完成这项工作 我使用子例程来使用一种或另一种方法来计算 ADS 着色 这是片段着色器代码的一部
  • 覆盖按钮的文本颜色不起作用

    我使用每个按钮上的buttonBarStyle 和布局上的buttonBarButtonStyle 为按钮栏创建了一个自定义主题 它工作正常 但我想更改按钮的文本颜色 但它仍然采用默认颜色 android color primary tex
  • OpenGL 与 Eclipse CDT + MinGW + GLEW + GLFW:未定义的参考

    Edit 与此同时 我已经弄清楚了这一点 并在下面写了详细的答案 我刚刚尝试在 Win7 上从 Express 版本的 MSVC 10 切换到 Eclipse CDT 在配置时遇到了以下简单 OpenGL 代码的问题 在 Visual St
  • 如何制作 HTML/CSS/JS 变色背景(如 Kahoot.it 那样)

    如何使用 html 和 css 以及可能的 javascript 制作类似于 waht 的颜色变化 褪色背景https kahoot it https kahoot it has 你应该学会检查和获取 keyframes bgcolor 0
  • SDL 鼠标位置调整大小后裁剪

    我在 SDL 中的鼠标位置上遇到了一些奇怪的行为 如果我将窗口大小调整得更大 则任一鼠标事件的 x y 位置似乎都限制为原始窗口的宽度和高度 如果我缺少一些函数调用来告诉 SDL 鼠标区域的大小已增加 应用程序的相关部分 void Resi
  • 每个刻度标签都有不同的颜色

    我正在尝试使用 matplotlib python 3 5 创建一个散点图 其中 x 轴上的每个刻度都有不同的颜色 这怎么可能 例如 假设 x 刻度为 Mo Tu We Th Fr Sa Su 现在我希望 Mo 是绿色的 Tu 是蓝色的 等
  • 如果我用opengl绘图的话SDL Renderer就没用了吗?

    我正在学习 SDL2 但我也在使用使用 OpenGL 调用的 imgui 库 从我在网上各种博客上读到的内容来看 我无法轻松混合 SDL2 渲染器和 opengl 调用 我要么使用其中之一 要么使用另一个 我读过的大多数教程都使用渲染器 所
  • 无法在 WSL2 上运行 OpenGL

    我尝试在 WSL2 上运行 OpenGL 代码 但在尝试运行可执行文件时出现以下错误 GLFW error 65543 GLX Failed to create context GLXBadFBConfig Unable to create
  • 自定义 colorRampPalette 中的颜色条

    我定义了一个 colorRampPalette my colors colorRampPalette c light green yellow orange red 如何为其绘制颜色条 图例 项目 最好仅使用基本包 我正在寻找一个充满该颜色
  • 预乘 Alpha 合成

    我正在尝试实现预乘阿尔法混合 在本页 什么是颜色混合 https learn microsoft com en us previous versions windows xna bb976070 v xnagamestudio 41 它们确
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 更改特定字符串的颜色

    有谁知道如果将特定单词输入文本区域 我如何更改它的颜色 例如 如果用户输入 你好我的朋友 它会动态地将 你好 更改为绿色 在google上花了很多时间 找不到任何相关的东西 谢谢 textareas 的设计目的不是选择性着色
  • 三角形纹理映射OpenGL

    我正在开发一个使用 Marching Cubes 算法并将数据更改为 3D 模型的项目 现在我想在 OpenGL 中为我的 3D 模型使用纹理映射 我首先尝试了一个简单的示例 它将图片映射到三角形上 这是我的代码 int DrawGLSce
  • JPEG 中的颜色配置文件检测

    我希望能够检测 JPEG 中是否存在颜色配置文件 需要明确的是 我对实际进行颜色校正或用它们做任何其他事情不感兴趣 我做了一些调查 但找不到任何明确的信息来源 到目前为止我所知道的是 里面有一个颜色配置信息XMP块 XMP 块位于0xFFE

随机推荐

  • 需要无效 Swing 组件的高度

    基本设置是这样的 我有一个垂直的 JSplitPane 我想要一个固定大小的底部组件和一个调整大小的顶部组件 我通过调用来完成setResizeWeight 1 0 在此应用程序中 有一个按钮可恢复 默认 窗口配置 窗口的默认高度是桌面高度
  • 向量化模运算

    我正在尝试编写一些相当快速的分量向量加法代码 我正在使用 我相信是有符号的 64 位整数 函数是 void addRq int64 t a const int64 t b const int32 t dim const int64 t q
  • 以下冒号 (:) 在 MATLAB 语法中意味着什么?

    a imread autumn tif a double a row col dim size a red a 1 green a 2 blue a 3 冒号有什么作用 最后三行是什么意思 上面的片段来自 Dhananjay Thecked
  • 如何在 Junit3 中获得 @BeforeClass 和 @AfterClass 等效项?

    我想在用测试装置替换应用程序的数据库之前备份它 由于 Android 限制 我被迫使用 Junit3 并且我想实现 BeforeClass 和 AfterClass 的等效行为 更新 现在有一个工具 Junit4Android 以获得支持
  • 使用 IText 创建 Pdf 文档#

    如何创建带有表格的 pdf 文档 如下所示 添加命名空间 using iTextSharp text using iTextSharp text pdf 使用c 的代码 Document doc new Document PageSize
  • SimpleAdapter、微调器中的文本和图像

    我有一个小问题 好吧 让我首先说明我想要实现的目标 我有一个旋转器 可以从存储的数组中提取字符串 就像这样 你不需要阅读它 ArrayAdapter
  • Android 中类似 iPhone 的标签栏?

    在 iPhone 中 我们可以创建一个具有选项卡栏的视图 并将其作为应用程序的根视图 然后使用选项卡栏在子视图中导航 Android 中与此最接近的方法是什么 是使用选项卡式控件吗 但这包括仅使用一项活动 在 Android 中使用什么方法
  • 混合声明和代码

    当我使用 gcc o dene Wall ansi pedantic errors dene c 编译函数时 gcc 不会发出错误 你能在 if 循环中查看以 char 开头的行吗 static void remove negation c
  • select() 最大套接字数

    只是更多异步的东西 好吧 现在我的主聊天应用程序有了一个可以工作的异步套接字程序 而且它运行得非常好 不过我有一个担心 使用 select 时 每组中可以使用的文件描述符的最大数量是多少 我读过关于 1024 的限制 如果该限制确实是硬编码
  • 如何将多个谓词应用于 java.util.Stream?

    如何将多个谓词应用于java util Stream s filter method 这就是我现在所做的 但我不太喜欢它 我有一个Collection的事物 并且我需要根据以下内容减少事物的数量Collection过滤器 谓词 的数量 Co
  • AngularJS 使用 FormData API 上传多个文件

    我需要使用 Laravel 5 1 作为后端 在 Angular 应用程序中将图像和视频文件上传到服务器 所有 Ajax 请求都需要首先发送到 Laravel 控制器 我们在那里有代码 说明文件到达那里后如何处理 我们之前已经完成了普通的
  • 将 PyTorch 与 Celery 结合使用

    我正在尝试在 Django 应用程序中运行 PyTorch 模型 由于不建议在视图中执行模型 或任何长时间运行的任务 我决定在 Celery 任务中运行它 我的模型相当大 加载大约需要 12 秒 推理大约需要 3 秒 这就是为什么我决定不能
  • 项目错误:QT 中的未知模块:websockets

    我正在尝试使用 Qt Creator 使用 QTWebsockets 运行一个简单的客户端示例 已经添加了 QT websockets 但是当我运行 build 或 qmake 时它会抛出这个问题 1 error Unknown modul
  • 列出并爆炸

    我正在尝试在我的网站上使用 url 重写 并且我想使用list and explode 函数来获取正确的内容 目前我的代码如下所示 list dir act explode url 在这种情况下 url等于绝对 url 中第一个斜杠之后的所
  • 在 Hibernate 4.3 中关闭 SessionFactory

    我正在将 Hibernate 升级到最新版本 与我的旧HibernateUtil java我没有遇到任何问题 但升级时 SessionFactory 似乎不再关闭 这是我的new HibernateUtil java class impor
  • Git:分支应该隔离更改,还是不应该?

    我以为我已经很好地掌握了 Git 但现在我感到惊讶 我认为分支会将更改与其他分支隔离 因此我在新分支中开始了大规模的实验性重构 这种重构意味着移动许多文件 当我切换到 master 时 我仍然可以看到变化 我转到我的沙箱存储库来复制问题 g
  • Python正则表达式在字符串中查找双引号中的字符串

    我正在使用正则表达式在 python 中寻找可以执行类似操作的代码 Input Regex should return String 1 or String 2 or String3 Output String 1 String2 Stri
  • 如何使用MediaSessionCompat并保持与RemoteControlClient的向后兼容性?

    我想使用 MediaSession 将我的应用程序中的 Android RemoteControlClient 类替换为新的类 但不适用于 API 级别 有什么片段或信息给我吗 谢谢大家 从 Support v4 库的修订版 22 开始 M
  • Laravel 非重叠计划作业未执行

    我有一个 Laravel Scheduled 作业 其定义为Kernel php like so schedule gt call App Http Controllers ScheduleController processQueuedM
  • 在opengl中将颜色应用于四边形中的单个顶点

    我正在尝试为绘制的四边形的单个顶点着色glDrawElements 我正在与cocos2d库 因此我能够清理源代码以准确了解发生了什么 代码如下 glBindVertexArray VAOname glDrawElements GL TRI