GLSL:包含struct

时间:2015-06-11 14:41:08

标签: java opengl jogl

我正在使用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布局。

0 个答案:

没有答案