Java OpenGL着色器获取不正确的数据,即使它看起来是正确的

Java OpenGL着色器获取不正确的数据,即使它看起来是正确的,java,opengl,lwjgl,opengl-3,Java,Opengl,Lwjgl,Opengl 3,我刚刚开始学习如何使用OpenGL 3.2,现在我正在尝试组装一个用于加载几何数据的实用程序。当我查看加载顶点的代码时,一切看起来都是正确的,我输入的调试输出似乎给了我正确的值。代码应该生成一个三角形,每个点都得到完整的r、g或b,但得到的几乎是纯红色/橙色 以下是包含几何体数据的代码: final float[] vertexPositions3 = new float[] { 0.0f, 0.5f, 0.0f, 1.0f, 0.5

我刚刚开始学习如何使用OpenGL 3.2,现在我正在尝试组装一个用于加载几何数据的实用程序。当我查看加载顶点的代码时,一切看起来都是正确的,我输入的调试输出似乎给了我正确的值。代码应该生成一个三角形,每个点都得到完整的r、g或b,但得到的几乎是纯红色/橙色

以下是包含几何体数据的代码:

    final float[] vertexPositions3 = new float[] {
            0.0f,    0.5f, 0.0f, 1.0f,
            0.5f, -0.366f, 0.0f, 1.0f,
            -0.5f, -0.366f, 0.0f, 1.0f,
            1.0f,    0.0f, 0.0f, 1.0f,
            0.0f,    1.0f, 0.0f, 1.0f,
            0.0f,    0.0f, 1.0f, 1.0f,
    };

    geometry = new Geometry();
    geometry.addBufferOffset(vertexPositions3, GL_STATIC_DRAW, 0, Geometry.VERTEX_4F, Geometry.VERTEX_4F);
以及加载它的代码:

protected int getDataTypeSize(int dataType) {
    if(dataType == VERTEX_1F) {
        return 1;
    }
    else if(dataType == VERTEX_2F) {
        return 2;
    }
    else if(dataType == VERTEX_3F) {
        return 3;
    }
    else {
        return 4;
    }
}

public void addBufferOffset(float[] data, int usage, int vertexColumn, int... dataTypes) {
    if(numAttributes + dataTypes.length >= MAX_VBO) {
        throw new IllegalStateException("Can only have up to 16 attributes, requested: " + (numAttributes + dataTypes.length));
    }

    int rowSize = 0;
    for(int type : dataTypes) {
        rowSize += getDataTypeSize(type);
    }
    if(numRows == 0) {
        numRows = data.length / rowSize;
    }
    else if(numRows != (data.length / rowSize)) {
        throw new IllegalStateException("Number of rows in buffers don't match: " + numRows + " vs " + (data.length / rowSize));
    }

    if(numVertices == 0) {
        numVertices = getDataTypeSize(dataTypes[0]) * (data.length / rowSize) / getDataTypeSize(dataTypes[0]);
    }
    else {
        int addingVerts = getDataTypeSize(dataTypes[0]) * (data.length / rowSize);
        if(addingVerts != numVertices) {
            throw new IllegalStateException("Vertex count for buffers don't match: " + numVertices + " vs " + addingVerts);
        }
    }
    glBindVertexArray(vao);

    FloatBuffer buf = BufferUtils.createFloatBuffer(data.length);
    buf.put(data);
    buf.flip();
    int vbo = glGenBuffers();
    vbos[numBuffers++] = vbo;
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, buf, usage);

    int startPos = 0;
    for(int i = 0; i < dataTypes.length; i++) {
        glEnableVertexAttribArray(numAttributes + i);
        glVertexAttribPointer(numAttributes + i, getDataTypeSize(dataTypes[i]), GL_FLOAT, false, 0, startPos);
        System.out.println((numAttributes + i) + ", " + getDataTypeSize(dataTypes[i]) + ", " + startPos);
        startPos += numRows * getDataTypeSize(dataTypes[i]);
    }
    System.out.println("Num verts: " + numVertices);
    if(usesIndices) {
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesRef);
    }
    numAttributes += dataTypes.length;
    glBindVertexArray(0);
}
最后是片段着色器:

#version 330

smooth in vec4 theColor;

out vec4 outputColor;

uniform float fragLoopDuration;
uniform float time;

const vec4 firstColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);
const vec4 secondColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);

void main() {
    float lerpTime = time * 1.5f / fragLoopDuration;
    outputColor = theColor;
}
当我运行程序时,addBufferOffset方法会产生以下输出:

0, 4, 0
1, 4, 12
Num verts: 3

这意味着它找到了两组三个顶点,每个顶点有四个浮点值。其中一个从阵列偏移量0开始,另一个从阵列偏移量12开始。这与发送给它的数组相对应:3个顶点具有x、y、z、w值,3个顶点具有r、g、b、a值。从输出来看,它似乎应该工作,但它不是。我真的很想得到一些帮助来解决这个问题。

我对lwjgl不太熟悉,但是C API中OpenGL
glVertexAttributePointer
函数的最后一个参数是数据的字节偏移量-看起来您是在传递数组索引。这可以解释为什么您会看到一个红色/橙色三角形,因为从第12个字节开始的数据(在3个浮点数之后)如下所示:

        1.0f, 0.5f, -0.366f, 0.0f,
        1.0f, -0.5f, -0.366f, 0.0f,
        1.0f, 1.0f,  0.0f, 0.0f
将这些值钳制在0和1之间将给出

        1.0f, 0.5f, 0.0f, 0.0f,
        1.0f, 0.0f, 0.0f, 0.0f,
        1.0f, 1.0f,  0.0f, 0.0f

假设您的混合设置忽略了零alpha分量,这些将提供橙色、红色和黄色顶点。

我不熟悉lwjgl,但是C API中OpenGL
glVertexAttribPointer
函数的最后一个参数是数据的字节偏移量——看起来您是在传递数组索引。这可以解释为什么您会看到一个红色/橙色三角形,因为从第12个字节开始的数据(在3个浮点数之后)如下所示:

        1.0f, 0.5f, -0.366f, 0.0f,
        1.0f, -0.5f, -0.366f, 0.0f,
        1.0f, 1.0f,  0.0f, 0.0f
将这些值钳制在0和1之间将给出

        1.0f, 0.5f, 0.0f, 0.0f,
        1.0f, 0.0f, 0.0f, 0.0f,
        1.0f, 1.0f,  0.0f, 0.0f

假设混合设置忽略零alpha分量,这些将提供橙色、红色和黄色顶点。

LWJGL对C API进行了几乎1:1的转换,只做了一些小的更改(例如不需要浮动缓冲区的长度,因为长度存储在对象中)。字节偏移量不正确是绝对正确的,非常感谢。我只需要把指数乘以4,一切都正常了。LWJGL几乎是C API的1:1转换,只做了一些小的更改(例如不需要FloatBuffer的长度,因为长度存储在对象中)。字节偏移量不正确是绝对正确的,非常感谢。我只需要把指数乘以4,一切都正常了。我为这件事发了一阵火。