在 OpenGL3 Core Profile 中使用矩阵作为顶点属性

2024-01-06

我在 OSX 上使用 OpenGL 3.2 Core Profile。 我想要进行实例化绘图(glDrawArraysInstanced),其中我为每个实例传递一个矩阵。

我的顶点着色器构建得很好:

#version 150
in mediump vec4 position;
in mediump mat4 trf;
in lowp vec4 rgb;
out lowp vec4 colour;
uniform highp mat4 modelcamviewprojmat;
void main()
{
    mediump vec4 tpos = trf * position;
    gl_Position = modelcamviewprojmat * tpos;
    colour = rgb;
}

“trf”的绑定顺利:

glBindAttribLocation(program, ATTRIB_TRF, "trf" );

但我怎样才能传递我的数据呢? glVertexAttribPointer 不能传递大于 4 个浮点数的值。 所以这个调用失败了:

glVertexAttribPointer( ATTRIB_TRF,   16, GL_FLOAT, 0, 16 * sizeof(float), ... );

我怀疑我需要用 4 次调用 glVertexAttribPointer 来替换它,每次调用 4 个浮点数。 但是我可以为“索引”(第一个参数)使用什么值?我是否需要使用 4 个向量属性,并在 GLSL 顶点着色器中组装这四个向量?如果是这样,什么样的 GLSL 代码可以完成这个任务?或者我可以使用 BindAttribLocation 的返回值并对所有行使用 val+0、val+1、val+2 和 val+3 吗?


根据这一页 http://sol.gfxile.net/instancing.html以及我目前在游戏中实现的硬件实例,正确的方法是mat4属性占用4个属性位置。您绑定的 1 个以及接下来的 3 个。

int pos = glGetAttribLocation(shader_instancedarrays.program, "transformmatrix");
int pos1 = pos + 0; 
int pos2 = pos + 1; 
int pos3 = pos + 2; 
int pos4 = pos + 3; 
glEnableVertexAttribArray(pos1);
glEnableVertexAttribArray(pos2);
glEnableVertexAttribArray(pos3);
glEnableVertexAttribArray(pos4);
glBindBuffer(GL_ARRAY_BUFFER, VBO_containing_matrices);
glVertexAttribPointer(pos1, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 4 * 4, (void*)(0));
glVertexAttribPointer(pos2, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 4 * 4, (void*)(sizeof(float) * 4));
glVertexAttribPointer(pos3, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 4 * 4, (void*)(sizeof(float) * 8));
glVertexAttribPointer(pos4, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 4 * 4, (void*)(sizeof(float) * 12));
glVertexAttribDivisor(pos1, 1);
glVertexAttribDivisor(pos2, 1);
glVertexAttribDivisor(pos3, 1);
glVertexAttribDivisor(pos4, 1);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 OpenGL3 Core Profile 中使用矩阵作为顶点属性 的相关文章

  • 网格的 VBO 不正确:某些三角形已连接且不应连接 [2D]

    我正在用这段代码生成我的VBO int SCREEN WIDTH 800 int SCREEN HEIGHT 480 int PIXEL PER VERTEX 4 int CAVERN TEXTURE WIDTH 1024 int CAVE
  • 如何用 C++ 为 GLSL 制作一维 lut

    我开始了解如何实现片段着色器来执行 1D LUT 但我正在努力寻找任何好的资源来告诉您如何在 C 中制作 1D LUT 然后对其进行纹理处理 因此 对于一个简单的示例 给出以下 1D lut 我会用以下数据创建一个数组吗 int color
  • 如何使用 ImageLoad() 访问深度纹理?

    我需要在 OpenGL 计算着色器中读取深度纹理数据 这是纹理初始化代码 glActiveTexture GL TEXTURE4 glGenTextures 1 framebufferDesc gt m DepthTextureId glB
  • OpenGL GLSL 统一分支与多个着色器

    我读过很多关于统一 if 语句的文章 这些语句处理分支以改变大型着色器 超级着色器 的行为 我开始使用 uber 着色器 opengl lwjgl 但后来我意识到 与没有统一 if 语句的单独着色器相比 在片段着色器中添加由统一的 if 语
  • GLSL 片段位置

    在我的 cpp 代码中 我创建了一个四边形列表 其中一些有一个标志 在像素着色器中 我检查是否设置了该标志 如果未设置标志 则四边形将变为红色 例如 如果设置了标志 我想决定每个像素的颜色 所以如果我需要将标记的四边形的一半着色为红色 另一
  • OpenGL Phong 光照:镜面高光错误

    我的 OpenGL 中的 Phong 光照着色器似乎有一个奇怪的问题 镜面高光出现在对象的错误一侧 手头的问题 正如您所看到的 镜面高光出现在立方体的另一侧 从灯光的角度来看 也出现在立方体垂直边缘的角上 它应该只出现在最靠近灯光的一侧 立
  • 如何创建和使用非常大的调色板纹理以在 opengl 中使用?

    详细信息 我有一个带有统一纹理的 glsl 片段着色器 u MapTexture 上面有几千种颜色 最多大约 10k 15k 唯一的 rgb 值 我还有一个统一的调色板纹理 u paletteTexture 大小为 16384 1 我想用它
  • 在 OpenGL ES 2.0 / GLSL 中,哪里需要精度说明符?

    您要填充值的变量是否决定了您在等号右侧使用的精度 例如 这里的精度说明符在含义上是否有任何区别 gl FragColor lowp vec4 1 这是另一个例子 lowp float floaty 1 2 floaty lowp 1 low
  • 着色器:如何在不生成几何体的情况下绘制 3D 点顶点?

    我有一个 3D Webgl 场景 我正在使用Reglhttp regl party http regl party 这就是WebGL 所以我本质上是直接写 GLSL 这是一个游戏项目 我有一个 3D 位置数组 x y z 它们是子弹或射弹
  • GLSL 版本变更日志?

    我可以在哪里阅读有关 GLSL 从版本 1 1 到 1 2 以及从 1 2 到 1 3 所做的更改和添加的信息吗 谷歌似乎对此不知所措 我真的不想开始阅读完整的规范 1 3版 http www opengl org registry doc
  • 顶点缓冲区对象(删除过程)opengl

    我什么时候应该调用 glDeleteBuffersARB 我应该在申请结束后做吗 我可以以某种方式自动化删除顶点缓冲区对象的过程吗 例如 smart ptr 之类的东西 绝不 你永远不应该打电话glDeleteBuffersARB 十多年来
  • 在 OpenGL 3.2 中绘制全屏四边形的最佳方法是什么?

    我正在片段着色器中进行光线投射 我可以想出几种方法来为此目的绘制全屏四边形 要么在剪辑空间中绘制一个四边形 并将投影矩阵设置为单位矩阵 要么使用几何着色器将点变成三角形带 前者使用立即模式 在 OpenGL 3 2 中已弃用 我使用后者是出
  • 您应该如何有效地批处理复杂的网格?

    渲染复杂网格的最佳方法是什么 我在下面写了不同的解决方案 想知道您对它们有何看法 让我们举个例子 如何渲染 Crytek Sponza 网格 PS 我不使用Ubershader 只使用单独的着色器 如果您通过以下链接下载网格 http gr
  • 如何在 WebGL 中创建合适的圆角矩形?

    我试图实现答案这个问题 https stackoverflow com questions 43970170 bordered rounded rectangle in glsl但似乎有点问题 如果您打开他们的 ShaderToys 并尝试
  • 如何快速将一个float打包为4个字节?

    我一直在寻找一种在 WebGL 纹理上存储浮动的方法 我找到了一些解决方案 http aras p info blog 2009 07 30 encoding floats to rgba the final 在互联网上 但那些只处理 0
  • OpenGL:调试“单通道线框渲染”

    我正在尝试实现论文 单通道线框渲染 它看起来很简单 但它给了我所期望的厚暗值 论文没有给出计算海拔高度的确切代码 所以我按照自己认为合适的方式进行了操作 代码应该将三个顶点投影到视口空间中 获取它们的 高度 并将它们发送到片段着色器 片段着
  • 如何将点光源转换为卵形/椭圆形?

    我希望通过具有不同 x 和 y 值的 vec2 半径将当前的圆形光变成椭圆形 有没有办法根据我当前在片段着色器中的代码来做到这一点 uniform struct Light vec4 colour vec3 position vec2 ra
  • 使用 GLSL 着色器在同一片段着色器中定义的多个子例程类型无法正常工作

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

    我正在寻找一种方法来使用一个函数作为 GLSL 中另一个函数的参数 在常规 C 中 可以通过传递函数指针作为函数参数来模拟它 似乎其他语言 如 HLSL 现在提供了处理高级构造 如高阶函数 的方法 或者可以使用以下命令来模拟它们巧妙利用 H
  • 为什么拥有单独的投影矩阵但结合模型和视图矩阵会有好处?

    当您学习 3D 编程时 您会被告知用 3 个变换矩阵来思考是最简单的 模型矩阵 该矩阵对于每个模型都是独立的 它根据需要旋转和缩放对象 最后将其移动到 3D 世界中的最终位置 模型矩阵将模型坐标转换为世界坐标 视图矩阵 对于大量对象 如果不

随机推荐

  • 如何在相关实体中搜索(Hibernate 搜索)

    我没有尝试这个东西 我的要求是按名称搜索记录 以下是我的相关课程 记录文件夹分析 java Indexed public class RecordFolderAnalysis extends AuditableEntity implemen
  • 继承最佳实践:*args、**kwargs 或显式指定参数 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我经常发现自己覆盖了父类的方法 并且永远无法决定是否应该显式列出给定的参数或仅使用毯子 args kwargs构造 一个版本比另一个版本更好吗
  • XAML / cs - 更新包后成员名称不能与其封闭类型 (CS0542) 相同

    我刚刚更新了应用程序中的软件包 并且收到了许多我不理解的此类新错误 Users alan Downloads Japanese 31 Japanese obj Debug Views Help GettingStarted xaml g c
  • SQL在删除子表行时锁定父表

    TLDR 当尝试通过 子 表上的主键删除包含另一个 父 表的外键的行时 它会在子事务的持续时间内锁定父表 如何使用外键 子删除来防止发生锁定 示例场景 Setup IF SELECT OBJECT ID dbo Child IS NOT N
  • 处理序列化框架的不兼容版本更改

    问题描述 我们有一个 Hadoop 集群 在该集群上存储使用以下命令序列化为字节的数据Kryo http code google com p kryo 序列化框架 我们用来执行此操作的 Kryo 版本是从官方版本 2 21 分叉出来的 以便
  • Kotlin 和 Android 中“没有足够的信息来推断参数 T”

    我正在尝试使用 Kotlin 在我的 Android 应用程序中复制以下 ListView https github com bidrohi KotlinListView https github com bidrohi KotlinLis
  • 准确确定 Python 多处理期间腌制的内容

    正如线程中所解释的当我调用 multiprocessing Process 时正在腌制什么 https stackoverflow com questions 26025878 what is being pickled when i ca
  • 将数据分组为模糊间隙和孤岛

    这本质上是一个间隙和岛屿问题 但它是非典型的 我确实将示例缩减到最低限度 我需要识别超过特定阈值的间隙 并且重复不会成为问题 尽管此示例删除了它们 在任何情况下 使用 ROW NUMBER 的常见解决方案都没有帮助 因为即使是 1 的间隙也
  • 构建应用程序后,Electron index.html 未加载

    我有一个电子应用程序 在与它捆绑之前运行得非常好electron builder 捆绑并打开应用程序后 出现以下错误 Not allowed to load local resource file tmp mount displa4VwuQ
  • 产品属性的数据库架构

    我想在类别中实现产品过滤 并且对正确的数据库架构有疑问 现在我有下表 类别 1 id 2 category 3 description Products 1 id 2 category id 3 product 4 image 5 pric
  • UDID 和 UUID 之间的区别[重复]

    这个问题在这里已经有答案了 有人说UDID Unique Device IDentifier 有人说UUID Universally Unique IDentifier 它们是否相同 它们之间有什么区别 UUID 通用唯一标识符 以每个应用
  • 闭包中局部变量的错误行为

    我被下面的代码困住了 首先 我将描述用例 使用 ColorGradient 实例调用函数 addPreset 打电话时this listController addItem 名为的回调函数onSelect是提供的 每次触发 listCont
  • 错误:useHref() 只能在 组件的上下文中使用

    当我直接在我的路由器组件中写入我的导航栏组件内容时 它工作正常 但是当我在导航栏组件中写入该内容时 它会生成以下错误 错误 useHref 只能在组件上下文中使用 我在用着 react dom 17 0 2 react router dom
  • 使用 clang 编译时 openmp 无法正确链接

    我已经在 Ubuntu 16 04 上从源代码构建了 clang 4 0 并尝试编译一个简单的 OpenMP 程序 但收到以下错误 tmp test 7f2c7c o In function main home me sf shared t
  • 选择两列之间的日期

    我需要一个 SQL 查询 如果我有两列STARTDATE and END DATE 我想选择日期位于这两个日期之间的所有行 例如 开始日期 1 1 2011 且结束日期 2 2 2011 SELECT FROM table1 WHERE 2
  • Laravel 4 中的通用访问器和修改器

    我知道可以为各个字段定义访问器和修改器 如下所示 public function setSomeAttribute value set the attribute public function getSomeAttribute retur
  • 如何在Java中获取客户端计算机上当前登录用户的用户名?

    当用户 客户端 尝试通过键入 URL 进入应用程序时 我需要获取该计算机的 Windows 登录用户名 我尝试过System getProperty user name 但是当我从其他机器 客户端 访问应用程序时 这仍然显示服务器上登录用户
  • 如何使用本地安装在node_modules中的包中的可执行文件?

    如何在中使用模块的本地版本node js 例如 在我的应用程序中 我安装了咖啡脚本 npm install coffee script 这会将其安装在 node modules咖啡命令是 node modules bin coffee 当我
  • 如何以编程方式从 UIView 获取约束

    我想从 UIView 获取 UILabel 约束 但我无法得到任何约束 我在 CustomView m 中设置约束 如下所示 id initWithFrame CGRect frame self super initWithFrame fr
  • 在 OpenGL3 Core Profile 中使用矩阵作为顶点属性

    我在 OSX 上使用 OpenGL 3 2 Core Profile 我想要进行实例化绘图 glDrawArraysInstanced 其中我为每个实例传递一个矩阵 我的顶点着色器构建得很好 version 150 in mediump v