我目前正在为我的游戏开发粒子系统。我想处理静态和简单几何的基本碰撞。为此,我生成一个描述一个段的矢量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]