LWJGL为什么我的几何有时会错误地渲染?

时间:2017-07-24 20:01:44

标签: java debugging opengl rendering lwjgl

我使用LWJGL和GLFW在java中创建了一个简单的opengl应用程序。 我创建了一个用于渲染纹理框的类。它创建顶点位置,纹理坐标,并使用VBO。该框使用GL_QUADS呈现。 当我启动程序来测试它时,有时: - 输出正确,我看到框正确呈现。 - 开箱即用的非常大,奇怪的(白色/灰色)三角形。 - 盒子完全变形,就像有很多三角形完全随机。

当我不更改任何代码时,结果每次都会有所不同。但有时候正确呈现。

我非常确定我的顶点纹理坐标是正确的。 很难找到错误的地方。我重新创建了box类,因此它使用texture.bind(); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_2D); glBindBuffer(GL_ARRAY_BUFFER, vboId); glVertexPointer(3, GL_FLOAT, 0, 0); glBindBuffer(GL_ARRAY_BUFFER, texId); glTexCoordPointer(2, GL_FLOAT, 0, 0); glDrawArrays(GL_TRIANGLES, 0, vertices.length); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisable(GL_TEXTURE_2D); Texture.unbind(); 呈现它(当然还要重新考虑顶点/纹理坐标)。 但后来我仍然得到了同样奇怪的行为。

很难的是每次程序运行时结果都不同,而代码没有被编辑。

这里有一些图片,其中一张图片全部正确: Correct rendered box

现在我再次运行程序,我得到了这个: enter image description here

等等......

有人知道会发生什么吗? 这就是我渲染框的方式:

package shapes;

import static org.lwjgl.opengl.GL11.GL_FLOAT;
import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D;
import static org.lwjgl.opengl.GL11.GL_TEXTURE_COORD_ARRAY;
import static org.lwjgl.opengl.GL11.GL_TRIANGLES;
import static org.lwjgl.opengl.GL11.GL_VERTEX_ARRAY;
import static org.lwjgl.opengl.GL11.glDisable;
import static org.lwjgl.opengl.GL11.glDisableClientState;
import static org.lwjgl.opengl.GL11.glDrawArrays;
import static org.lwjgl.opengl.GL11.glEnable;
import static org.lwjgl.opengl.GL11.glEnableClientState;
import static org.lwjgl.opengl.GL11.glTexCoordPointer;
import static org.lwjgl.opengl.GL11.glVertexPointer;
import static org.lwjgl.opengl.GL15.GL_ARRAY_BUFFER;
import static org.lwjgl.opengl.GL15.GL_STATIC_DRAW;
import static org.lwjgl.opengl.GL15.glBindBuffer;
import static org.lwjgl.opengl.GL15.glBufferData;
import static org.lwjgl.opengl.GL15.glGenBuffers;

import java.nio.FloatBuffer;

import main.Geometry;

import org.lwjgl.BufferUtils;

import textures.Texture;

public class TriangleBox extends Geometry {

    private float sizeX;
    private float sizeY;
    private float sizeZ;

    private short[] indices;
    private float[] texCoords;

    private int vboId;
    private int texId;
    private int indId;

    private Texture texture;

    /**
     * Creates a beam figure (a bar)
     * 
     * @param widthX
     * @param heightY
     * @param depthZ
     */
    public TriangleBox(float widthX, float heightY, float depthZ, Texture tex) {

        this.sizeX = widthX;
        this.sizeY = heightY;
        this.sizeZ = depthZ;

        this.setTexture(tex);
        this.createVertices();
        this.createVBO();
    }

    public void setTexture(Texture tex) {

        this.texture = tex;
    }

    protected void createVertices() {

        vertices = new float[] { 
                //Bottom
                0, 0, 0,    
                1, 0, 0,    
                0, 0, 1,    

                0, 0, 1,    
                1, 0, 0,    
                1, 0, 1,    

                //Top
                0, 1, 0,    
                1, 1, 0,    
                0, 1, 1,    

                0, 1, 1,    
                1, 1, 0,    
                1, 1, 1,    

                //Front
                0, 1, 1,    
                1, 1, 1,    
                0, 0, 1,    

                0, 0, 1,    
                1, 1, 1,    
                1, 0, 1,    

                //Back
                1, 1, 0,    
                0, 1, 0,    
                1, 0, 0,    

                1, 0, 0,    
                0, 1, 0,    
                0, 0, 0,    

                //Left
                0, 1, 0,    
                0, 1, 1,    
                0, 0, 0,    

                0, 0, 0,    
                0, 1, 1,
                0, 0, 1,

                //Right
                1, 1, 1,
                1, 1, 0,
                1, 0, 1,

                1, 0, 1,
                1, 1, 0,
                1, 0, 0,
        };

        texCoords = new float[] { 
                // Bottom
                0f,     .33f,
                .25f,   .33f,
                0f,     .66f,

                0f,     .66f,
                .25f,   .33f,
                .25f,   .66f,

                // Top
                .75f,   .33f,
                .50f,   .33f,
                .75f,   .66f,

                .75f,   .66f,
                .50f,   .33f,
                .50f,   .66f,

                // Front  
                0f,     1f  ,
                .25f,   1f  ,
                0f,     .66f,

                0f,     .66f,
                .25f,   1f  ,
                .25f,   .66f,

                // Back
                .25f,   0f  ,
                0f,     0f  ,
                .25f,   .33f,

                .25f,   .33f,
                0f,     0f  ,
                0f,     .33f,

                // Left
                .75f,   .33f,
                .75f,   .66f,
                1f,     .33f,

                1f,     .33f,
                .75f,   .66f,
                1f,     .66f,

                // Right
                .50f,   .66f,
                .50f,   .33f,
                .25f,   .66f,

                .25f,   .66f,
                .50f,   .33f,
                .25f,   .33f
        };
    }

    public void createVBO() {

        FloatBuffer vertexBuffer = BufferUtils.createFloatBuffer(vertices.length);
        vertexBuffer.put(vertices);
        vertexBuffer.flip();

        FloatBuffer texCoordBuffer = BufferUtils.createFloatBuffer(texCoords.length);
        texCoordBuffer.put(texCoords);
        texCoordBuffer.flip();

        vboId = glGenBuffers();
        glBindBuffer(GL_ARRAY_BUFFER, vboId);
        glBufferData(GL_ARRAY_BUFFER, vertexBuffer, GL_STATIC_DRAW);

        texId = glGenBuffers();
        glBindBuffer(GL_ARRAY_BUFFER, texId);
        glBufferData(GL_ARRAY_BUFFER, texCoordBuffer, GL_STATIC_DRAW);

        glBindBuffer(GL_ARRAY_BUFFER, 0);
    }

    public void render() {

        texture.bind();

        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glEnable(GL_TEXTURE_2D);

        glBindBuffer(GL_ARRAY_BUFFER, vboId);
        glVertexPointer(3, GL_FLOAT, 0, 0);

        glBindBuffer(GL_ARRAY_BUFFER, texId);
        glTexCoordPointer(2, GL_FLOAT, 0, 0);

        glDrawArrays(GL_TRIANGLES, 0, vertices.length);

        glDisableClientState(GL_VERTEX_ARRAY);
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
        glDisable(GL_TEXTURE_2D);

        Texture.unbind();
    }
}

如果有人知道导致改变结果的原因,它已经有所帮助。

我的盒子类的代码:

#version 120

attribute vec3 position;

void main() {

    gl_Position = vec4(position.x, position.y, position.z, 1.0);
}

顶点着色器:

#version 120

void main() {

    gl_FragColor = gl_Color; //vec4(0.1, 1.0, 1.0, 1.0);
}

片段着色器

    Include /test/custom.conf

1 个答案:

答案 0 :(得分:0)

因为在图片中你从不同的角度显示框,我最好的猜测仍然是,顶点有问题。所以也许每次运行时都不会得到不同的结果,但实际上只能从不同的角度看到相同的结果,这会因为面部清理或其他原因使对象显得不同。

尝试渲染四边形(更容易确定正确的顶点)并查看是否仍然得到相同的结果。