【问题标题】:What is the actual number of vertex uniform components for GLSL shader on ATI graphics card?ATI 显卡上 GLSL 着色器的顶点均匀组件的实际数量是多少?
【发布时间】:2011-12-21 07:51:08
【问题描述】:

我正在为配备 AMD Radeon HD 6970M 2048 MB 显卡的 iMac 编写 GLSL 顶点着色器:

GL_MAX_VERTEX_ATTRIBS: 16
GL_MAX_VERTEX_UNIFORM_COMPONENTS: 4096
GL_VERSION: 2.1 ATI-7.12.9
GL_SHADING_LANGUAGE_VERSION: 1.20

在我的着色器中,我希望有大量统一的 mat4:

uniform mat4 T[65]

但如果我尝试使用其中的 65 个,我的着色器(秘密地)切换到 Apple Software Renderer 模式。如果我改为使用 64:

uniform mat4 T[64]

一切都很好。

似乎是超过制服的最大数量的问题。但正如我在上面写的,我得到 4096 的 GL_MAX_VERTEX_UNIFORM_COMPONENTS 所以 4096/(4*4) = 256 而不是 64...

OpenGL.org wiki

ATI/AMD 注意:ATI 最大组件值错误。它们是实际的组件数除以 4。

但是读到这里,我想如果我查询 GL_MAX_VERTEX_UNIFORM_COMPONENTS 并得到 4096,我实际上有 16,384。似乎情况是 GL_MAX_VERTEX_UNIFORM_COMPONENTS 返回组件的实际数量 4。这将得到 1024/(4*4) = 64。

谁能证实这一点?

编辑: 我的着色器很简单:

#version 120

// 65 goes into software render mode
#define MAX_T 64
attribute vec4 indices;
uniform mat4 T[MAX_T];

void main()
{
  gl_Position =  T[int(indices[0])]*gl_Vertex;
}

【问题讨论】:

  • 能否请您发布您的着色器代码,或者至少发布所有使用的制服的定义。你是对的,你需要将 1024 除以 4 而不是相乘。 wiki 条目的措辞很糟糕。
  • 我在上面发布了着色器代码(我还注意到在我的计数中有一个错误之前,我相应地编辑了原始问题 63->64 和 64->65 中的数字)。
  • @datenwolf 您应该将此作为答案发布,因为这显然是他的问题。我猜他只是使用了一些其他的小制服来“阻挡”最后 64 个矩阵槽(我认为内置制服也算在内)。
  • 我很好奇:如果你创建两个长度为 33 的 mat4 数组会发生什么?
  • @Nicol 33 不起作用,因为您最终得到 66。另一方面,32 确实有效。

标签: opengl glsl shader ati


【解决方案1】:

你是对的,你需要将 4096 除以 4 而不是相乘。 wiki 条目 is 措辞不当。

【讨论】:

  • 不是措辞不好;再看一遍。也不要查看该页面上的编辑历史记录;我敢肯定,写它的人在看到这个 Q/A 后肯定没有更正它。不,这肯定不是在几分钟前发生的。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多