Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LWJGL纹理不在网格上绘制_Java_Opengl_Textures - Fatal编程技术网

Java LWJGL纹理不在网格上绘制

Java LWJGL纹理不在网格上绘制,java,opengl,textures,Java,Opengl,Textures,我有一个很常见的问题,就是试图用图像对简单的三角形进行纹理处理。代码如下: 安装openGL: glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(70,(float)width/(float)height, 0.3f, view); glMatrixMode(GL_MODELVIEW); glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); glEnable(GL_DEPTH_TE

我有一个很常见的问题,就是试图用图像对简单的三角形进行纹理处理。代码如下:

安装openGL:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(70,(float)width/(float)height, 0.3f, view);  
glMatrixMode(GL_MODELVIEW);
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_VERTEX_ARRAY);
glEnable(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
网格类别:

 public class Mesh {
        protected int TextureID=0;
        protected int VertID=-1,TrisID=-1,TexID=-1;
        protected Vector3 position,rotation,scale;
    protected ArrayList<Vector3> verts;
    protected ArrayList<Vector3> tris;
    protected ArrayList<Vector3> uvs;
    public Mesh(Vector3 position,Vector3 rotation,Vector3 scale){
        verts= new ArrayList<Vector3>();
        tris= new ArrayList<Vector3>();
        uvs= new ArrayList<Vector3>();
        this.position = position;
        this.rotation=rotation;
        this.scale=scale;
    }
    public void draw(){
        glPushMatrix();{
            // Translate Submatrix
            glScalef(scale.X, scale.Y, scale.Z);
            glRotatef(rotation.X,1,0,0);
            glRotatef(rotation.Y,0,1,0);
            glRotatef(rotation.Z,0,0,1);
            glTranslatef(position.X, position.Y, position.Z);
            //bind and pointer buffers and textures

            TextureLoader.textureList.get(TextureID).bind();
              glBindTexture(GL_TEXTURE_2D,TextureID);
              GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, TexID);
              glTexCoordPointer(2, GL_FLOAT, 0, 0);

            glDisableClientState(GL_TEXTURE_COORD_ARRAY);
              GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VertID);
              glVertexPointer(3, GL_FLOAT, 0, 0);
              int mode = GL_TRIANGLES;

              GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, TrisID);

              //draw
              glDrawElements(mode,tris.size()*3, GL_UNSIGNED_INT, 0);


        }glPopMatrix();
    }

    public Mesh generate(){
    updateVertBuffer();
    updateTrisBuffer();
    updateUvBuffer();
        return this;
    }
    public void updateVertBuffer(){
        if(VertID==-1)VertID= GL15.glGenBuffers();
        FloatBuffer buffer = BufferUtils.createFloatBuffer(verts.size()*3);
        for(int i=0;i<verts.size();i++){
            buffer.put(verts.get(i).X);
            buffer.put(verts.get(i).Y);
            buffer.put(verts.get(i).Z);
        }
        buffer.flip();
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER,VertID);
        GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);
    }
    public void updateTrisBuffer(){
        if(TrisID==-1)TrisID = GL15.glGenBuffers();
        IntBuffer buffer = BufferUtils.createIntBuffer(tris.size()*3);
        for(int i=0;i<tris.size();i++){
            buffer.put((int)tris.get(i).X);
            buffer.put((int)tris.get(i).Y);
            buffer.put((int)tris.get(i).Z);
        }
        buffer.flip();
        GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, TrisID);
        GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, buffer,GL15.GL_STATIC_DRAW);
    }
    public void updateUvBuffer(){
        if(TexID==-1)TexID= GL15.glGenBuffers();
        FloatBuffer buffer = BufferUtils.createFloatBuffer(uvs.size()*2);
        for(int i=0;i<uvs.size();i++){
            buffer.put(uvs.get(i).Y);
            buffer.put(uvs.get(i).Z);
        }
        buffer.flip();
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, TexID);
        GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);
    }
工作但不带纹理的示例网格:

    Mesh m = new Mesh(new Vector3(0,0,0),new Vector3(0,0,0),new Vector3(10,10,10));
    m.addVert(new Vector3(0,0,0),new Vector3(0,0,0));
    m.addVert(new Vector3(0,1,0),new Vector3(0,1,0));
    m.addVert(new Vector3(0,1,1),new Vector3(0,1,1));
    m.addTriangle(new Vector3(0,1,2));
MHandler.add(m);
我知道代码有点太多了,但我真的不知道问题出在哪里。因为我是openGL新手,任何对代码的批评都会有所帮助。
如果有帮助的话,我可以使用Slick加载纹理。

您是否检查了OpenGL方法返回的错误?你能增加更多关于你得到的信息吗?例如,渲染的网格,但没有纹理,它们根本没有渲染等等,如果很难描述,考虑张贴一个图像?网格渲染但没有纹理。我无法上传图像bcs我需要10次重复您是否调用glDisableClientStateGL_纹理_坐标_数组;故意渲染网格时?是的,搞错了。但是仍然不起作用
    Mesh m = new Mesh(new Vector3(0,0,0),new Vector3(0,0,0),new Vector3(10,10,10));
    m.addVert(new Vector3(0,0,0),new Vector3(0,0,0));
    m.addVert(new Vector3(0,1,0),new Vector3(0,1,0));
    m.addVert(new Vector3(0,1,1),new Vector3(0,1,1));
    m.addTriangle(new Vector3(0,1,2));
MHandler.add(m);