我正在使用JOGL在Java中开发小型OpenGL应用程序。我面临以下问题:我在片段着色器中声明了一个统一缓冲区对象“Light”,如下所示:
struct PerLight
{
vec4 cameraSpaceLightPos;
vec4 lightIntensity;
};
const int numberOfLights = 4;
uniform Light
{
vec4 ambientIntensity;
float lightAttenuation;
PerLight lights[numberOfLights];
} Lgt;
据我了解,将数据放入UBO中唯一不直接的部分是浮动“lightAttenuation”需要用3个浮点数填充。
我将数据放入缓冲区中如下(除了lightAttenuation之外的所有值都是具有4个浮点值的数组):
gl.glBindBuffer(GL2.GL_UNIFORM_BUFFER, lightUniformBuffer[0]);
FloatBuffer buffer = Buffers.newDirectFloatBuffer(2 * (2 + DynamicRangeLights.NUMBER_OF_LIGHTS * 2) * 4);
buffer.put(lightData.ambientIntensity.getArray());
buffer.put(new float[] { lightData.lightAttenuation, 0.0f, 0.0f, 0.0f });
for (int i = 0; i < 4; ++i) {
buffer.put(lightData.lights[i].cameraSpaceLightPos.getArray());
buffer.put(lightData.lights[i].lightIntensity.getArray());
}
buffer.rewind();
gl.glBufferSubData(GL2.GL_UNIFORM_BUFFER, 0, sizeLightBlock, buffer);
但我得到的结果是错误的:灯光的颜色和强度完全没有了。
如果我在片段着色器中重写UBO如下,一切正常:
uniform Light
{
vec4 ambientIntensity;
float lightAttenuation;
vec4 cameraSpaceLightPos0;
vec4 lightIntensity0;
vec4 cameraSpaceLightPos1;
vec4 lightIntensity1;
vec4 cameraSpaceLightPos2;
vec4 lightIntensity2;
vec4 cameraSpaceLightPos3;
vec4 lightIntensity3;
} Lgt;
据我所知,两个UBO应该收到相同的数据并显示相同的结果,但显然我错了。这两个UBO之间有什么区别,我应该如何缓冲第一个中的数据以获得与第二个相同的结果?
编辑:我忘了提及它,但我在我的着色器中使用
layout(std140) uniform;
所以如果我没错,所有制服都会使用std140布局。