【问题标题】:LWJGL texture render shifted in to directions when Rendering with VAO使用 VAO 渲染时,LWJGL 纹理渲染向方向移动
【发布时间】:2020-05-09 15:43:14
【问题描述】:

所以这里是发生了什么的屏幕截图。

这也是制作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
        });

任何帮助都会很好

【问题讨论】:

    标签: java opengl lwjgl


    【解决方案1】:

    当图像加载到纹理对象时,GL_UNPACK_ALIGNMENT 必须设置为 1。
    默认情况下GL_UNPACK_ALIGNMENT 为 4,因此假定图像的每一行对齐到 4 个字节。如果图像中像素的大小不是 4 的倍数(例如 GL_RGB 或 GL_RED),那么这将导致错位。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多