Рендеринг текстуры LWJGL смещен в направлениях при рендеринге с VAO - PullRequest
1 голос
/ 09 мая 2020

Итак, вот скриншот того, что происходит.

Также вот метод, который делает vao

public boolean create(float[] modelData) {

        FloatBuffer buffer = BufferUtils.createFloatBuffer(modelData.length);
        buffer.put(modelData);
        buffer.flip();

        vaoID = glGenVertexArrays();
        glEnableVertexAttribArray(0);

        glBindVertexArray(vaoID);

        vboID = glGenBuffers();

        glBindBuffer(GL_ARRAY_BUFFER, vboID);
        glBufferData(GL_ARRAY_BUFFER, buffer, GL_STATIC_DRAW);
        glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);

        glDisableVertexAttribArray(0);
        glBindVertexArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);

        vertexCount = modelData.length / 3;

        return true;

    }

и тот, который добавляет uv-координаты

public void addUV(float[] uv) {

        FloatBuffer buffer = BufferUtils.createFloatBuffer(uv.length);
        buffer.put(uv);
        buffer.flip();

        glBindVertexArray(vaoID);

        uvCoordLoc = glGetAttribLocation(shade.getProgramID(), "uv");

        glEnableVertexAttribArray(uvCoordLoc);
        glVertexAttribPointer(uvCoordLoc, 2, GL_FLOAT, false, 0, buffer);
        glDisableVertexAttribArray(uvCoordLoc);

        glBindVertexArray(0);

    }

и, наконец, тот, который отображает.

    public void draw(int texID) {

        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, texID);

        int texLoc = glGetUniformLocation(shade.getProgramID(), "tex");
        glUniform1i(texLoc, 0);


        glBindVertexArray(vaoID);
        glEnableVertexAttribArray(0);
        glEnableVertexAttribArray(uvCoordLoc);

        shade.start();
        glDrawArrays(GL_QUADS, 0, vertexCount);
        shade.stop();

        glDisableVertexAttribArray(0);
        glDisableVertexAttribArray(uvCoordLoc);
        glBindVertexArray(0);

        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, 0);

    }

И вершинный шейдер моих шейдеров

#version 130

out vec4 theColor;
out vec2 uvCoord;

in vec2 uv;

void main() {   

    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

    theColor = gl_Position;

    uvCoord = uv;

}

фрагментный шейдер.

#version 130

in vec4 theColor;
in vec2 uvCoord;

uniform sampler2D tex;

void main() {

    gl_FragColor = texture(tex, uvCoord).rgba;

}

Я пробовал возиться с uv-координатами, но это у меня пока получилось.

и данные модели и uv-координаты

        Model model = new Model();
        model.create(new float[] {
            -0.5f,-0.5f,-2f,
            -0.5f,0.5f,-2f,
            0.5f,0.5f,-2f,
            0.5f,-0.5f,-2f
        });
        model.addUV(new float[] {
                0,1,
                0,0,
                1,0,
                1,1
        });

любая помощь была бы хороша

1 Ответ

1 голос
/ 09 мая 2020

Когда изображение загружается в объект текстуры, тогда GL_UNPACK_ALIGNMENT должно быть установлено на 1.
По умолчанию GL_UNPACK_ALIGNMENT равно 4, поэтому предполагается, что каждая строка изображения быть выровненным по 4 байта. Если размер пикселя в изображении не кратен 4 (например, GL_RGB или GL_RED), то это вызовет смещение.

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(...);
...