opengl - 布局量词(位置)是否应该在统一/输入/输出之间有所不同?

标签 opengl glsl shader

我现在正在为我的 GLSL 着色器设置布局量词(位置)。这个问题打动了我,这些量词 ID 是否需要彼此不同。

是否必须是:

layout (location = 0) uniform vec3 v1;
layout (location = 1) in vec3 v2;
layout (location = 2) uniform vec3 v3;
layout (location = 3) in vec3 v4;

也可以是(因为可以将位置指定为制服或输入):

layout (location = 0) uniform vec3 v1;
layout (location = 0) in vec3 v2;
layout (location = 1) uniform vec3 v3;
layout (location = 1) in vec3 v4;

谢谢。

最佳答案

而对于顶点着色器属性,布局位置是属性索引,
统一变量的布局位置是统一位置。
这些是不同的东西。

如果不设置显式布局位置,在链接着色器程序后读取位置,可以看到它们可以在同一个范围内。
这可以通过 glGetAttribLocation 完成
glGetUniformLocation

您的两种变体都是正确且可能的。
属性位置必须是唯一的,统一位置必须是唯一的。
但它们不必是明确的,超出位置索引类型。

有关布局限定符的更多详细信息,我推荐 Khronos Group 的 OGL 和 GLSL 文档:
Layout Qualifier (GLSL)

分别见OpenGL 4.6 API Core Profile Specification - 7.3.1 Program Interfaces .

Each entry in the active resource list for an interface is assigned a unique unsigned integer index in the range zero to N − 1, where N is the number of entries in the active resource list.



而统一变量的接口(interface)类型是UNIFORM ,属性类型为 PROGRAM_INPUT .不同程序资源的位置可以通过指令 glGetProgramResourceLocation 获取。通过其程序接口(interface)类型和名称。

关于opengl - 布局量词(位置)是否应该在统一/输入/输出之间有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45261908/

相关文章:

opengl - #version 330 和#version 330 核心有什么区别?

opengl-es - GLSL集成功能

c++ - 在图形应用程序中,为什么着色器会在运行时加载到应用程序中?

ios - 如何知道我们是否可以使用 half4 而不是 float4?

c++ - 无法从 glGetShaderInfoLog 检索错误消息

c++ - OpenGL; gluBuild2DMipmaps 无效枚举

c++ - 具有显式数组与非显式数组的 glBufferData

c - OpenGL - 帧缓冲区深度纹理不同于颜色深度纹理

java - Bresenham画圆算法Java实现

C++ 比较阴影贴图矩阵和绘制矩阵不会产生阴影