繁体   English   中英

使用 VAO 渲染时,LWJGL 纹理渲染向方向移动

[英]LWJGL texture render shifted in to directions when Rendering with VAO

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

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

}

我试过弄乱紫外线坐标,但这是我到目前为止所得到的。

和 model 数据和 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
        });

你能帮忙的话,我会很高兴

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM