惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
大猫的无限游戏
大猫的无限游戏
J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
Martin Fowler
Martin Fowler
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
Recent Announcements
Recent Announcements
F
Fortinet All Blogs
B
Blog
U
Unit 42
B
Blog RSS Feed
D
DataBreaches.Net
Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
腾讯CDC
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
V
Visual Studio Blog
博客园 - 聂微东
MyScale Blog
MyScale Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
Engineering at Meta
Engineering at Meta

博客园 - 游戏行者

ubuntu 24 之后,登录时出现server refused our key,不认原来的ssh key的解决方法 zoho企业邮件管理页,如何登录 thunderBird如何选择配置文件 鼠标对码 PVE更换主板后,如何修改绑定网卡 关于ubuntu和debian的配置,以及vultr的防火墙设置 - 游戏行者 entity framework core使用sqlServer localDB指定文件路径 windows 10如何更改字体大小和开启防蓝光 ubuntu挂载ntfs分区(读写模式) vmware ubuntu虚拟机设置共享文件夹之后,虚拟机重启找不到的问题 Esxi(vSphere) 安装经验 瑞芯微系列主板刷机方法 f#如何设定main函数 探索texture对象的生命周期 opengl管理texture参数的函数总结 opengl 如何从指定位置画三角形,理解opengl的指针 vk.xml生成之坑 写代码的技巧 vulkan的QueueFamilyProperties
Opengl vertex shader中, layout location最多允许几个,或...
游戏行者 · 2020-08-17 · via 博客园 - 游戏行者

先看一段vertex shader

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;

out vec3 ourColor;
out vec2 TexCoord;

void main()
{
gl_Position = vec4(aPos, 1.0);
ourColor = aColor;
TexCoord = vec2(aTexCoord.x, aTexCoord.y);
}

当我们在调用shader之前,会声明vertex的attribPointer,实际上就是告诉显卡,这个vertex的内存布局

location=xxx,这个东东叫vertex attribute index

GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 8 * sizeof(float), 0);
GL.EnableVertexAttribArray(0);
GL.VertexAttribPointer(1, 3, VertexAttribPointerType.Float, false, 8 * sizeof(float), 3 * sizeof(float));
GL.EnableVertexAttribArray(1);
GL.VertexAttribPointer(2, 2, VertexAttribPointerType.Float, false, 8 * sizeof(float), 6 * sizeof(float));
GL.EnableVertexAttribArray(2);

三次调用GL.VertexAttribPointer的第一个参数,0,1,2,就是location

那么,能不能不按照递增顺序写呢?比如,第一个改成5,怎么样?

答案是,可以。

如果shader里这样写:(省略后半部分shader)

#version 330 core
layout (location = 5) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;

那么描述aPos的代码,就应该这样改:

GL.VertexAttribPointer(5, 3, VertexAttribPointerType.Float, false, 8 * sizeof(float), 0);
GL.EnableVertexAttribArray(5);

把vertex attribute index,都修改为5.

那么,最大的vertex attribute index是多少呢?可以通过一个函数来查询:

int maxVertexAttrib = GL.GetInteger(GetPName.MaxVertexAttribs);

我的显卡是gt 1030,这个值是16。

看官方文档,描述如下:

GL_MAX_VERTEX_ATTRIBS

data returns one value, the maximum number of 4-component generic vertex attributes accessible to a vertex shader. The value must be at least 16. See glVertexAttrib.

官方文档规定的最小值就是16。显卡也就只实现了16个。实际上也够用了,平时也就是位置法线纹理切线负切线。

也就是说,一般情况下,顶点可以有最多16个属性。