OpenGL Uniform缓冲区对象使用NVidia驱动程序但不支持Intel芯片组驱动程序

时间:2015-10-01 18:55:00

标签: c++ opengl glsl intel nvidia

我目前正在为我的游戏开发粒子系统。我想处理静态和简单几何的基本碰撞。为此,我生成一个描述一个段的矢量4数组(两个点带有XY坐标)。然后在我的顶点着色器中,我用它来进行交叉测试。

问题是,当我在我的NVidia GPU上运行游戏但在我的英特尔芯片组上运行游戏时,它可以正常运行。所以我猜我的实现有问题,因为NVidia驱动程序非常灵活。

OpenGL调用

// COLLIDER_BLOCK_INDEX = 0

// glGenBuffers - glBufferData

// Bind UBO to shader
GLuint block_index = glGetUniformBlockIndex(program, "collider_data");
glUniformBlockBinding(program, block_index, COLLIDER_BLOCK_INDEX);
glBindBufferRange(GL_UNIFORM_BUFFER, COLLIDER_BLOCK_INDEX,
                  _uboCollider, 0, 64 * sizeof(GLfloat) * 4);

// Send data on GPU
glBufferSubData(GL_UNIFORM_BUFFER, 0, 64 * sizeof(GLfloat) * 4, _collider);

// Bind UBO before using it
glBindBufferBase(GL_UNIFORM_BUFFER, COLLIDER_BLOCK_INDEX, _uboCollider);

我的数据声明

glm::vec4 _collider[64];

顶点着色器(简化)

#version 330
layout(std140) uniform collider_data {
vec4 collider[64];
};

我将数据读作:

vec2(collider[i][0], collider[i][1]) // A point
vec2(collider[i][2], collider[i][3]) // B point

问题

正如我所说,一切都在NVidia GPU上运行良好,但在Intel芯片组上却没有。有人在这段代码上看错了吗? 我很确定我的问题来自这个UBO,因为当我完全删除它时,一切都适用于两个驱动程序。

另外,我没有任何OpenGL错误(glGetError())。

英特尔芯片组规格

OpenGL version [4.2.0 - Build 10.18.10.3574]
Shader version [4.20 - Build 10.18.10.3574]
GL_MAX_FRAGMENT_UNIFORM_BLOCKS [14]
GL_MAX_UNIFORM_BLOCK_SIZE [16384]
GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT [16]

0 个答案:

没有答案