我一直在尝试实现颜色选择,但它不能正常工作。问题是,如果最初用用于采摘的不同颜色绘制我的模型(我的意思是,我给每个三角形不同的颜色,这是他的 id 颜色),它可以正常工作(没有纹理或任何东西..),但是如果我放置模型的纹理,并且当单击鼠标时,我通过为每个三角形赋予不同的颜色来绘制模型,它不起作用..这是代码:
public int selection(int x, int y) {        
    GL11.glDisable(GL11.GL_LIGHTING);
    GL11.glDisable(GL11.GL_TEXTURE_2D);
    IntBuffer viewport = BufferUtils.createIntBuffer(16); 
    ByteBuffer pixelbuff = BufferUtils.createByteBuffer(16);
    GL11.glGetInteger(GL11.GL_VIEWPORT, viewport);              
    this.render(this.mesh);
    GL11.glReadPixels(x, y, 1, 1, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, pixelbuff);
    for (int m = 0; m < 3; m++)
        System.out.println(pixelbuff.get(m));
   GL11.glEnable(GL11.GL_TEXTURE_2D);
   GL11.glEnable(GL11.GL_LIGHTING);
    return 0;
}
public void render(GL_Mesh m, boolean inPickingMode)
{
    GLMaterial[] materials = m.materials;   // loaded from the .mtl file
    GLMaterial mtl;
    GL_Triangle t;
    int currMtl = -1;
    int i = 0;
    // draw all triangles in object
    for (i=0; i < m.triangles.length; ) {
        t = m.triangles[i];
        // activate new material and texture
        currMtl = t.materialID;
        mtl = (materials != null && materials.length>0 && currMtl >= 0)? materials[currMtl] : defaultMtl;
        mtl.apply();
        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mtl.textureHandle);
        // draw triangles until material changes
        for ( ; i < m.triangles.length && (t=m.triangles[i])!=null && currMtl == t.materialID; i++) {
                drawTriangle(t, i, inPickingMode);
        }
    }
}
私人无效drawTriangle(GL_Triangle t,int i,布尔inPickingMode){
    if (inPickingMode) {
        byte[] triColor = this.triangleToColor(i);
        GL11.glColor3ub((byte)triColor[2], (byte)triColor[1], (byte)triColor[0]);
    }
    GL11.glBegin(GL11.GL_TRIANGLES);
    GL11.glTexCoord2f(t.uvw1.x, t.uvw1.y);
    GL11.glNormal3f(t.norm1.x, t.norm1.y, t.norm1.z);
    GL11.glVertex3f( (float)t.p1.pos.x, (float)t.p1.pos.y, (float)t.p1.pos.z);
    GL11.glTexCoord2f(t.uvw2.x, t.uvw2.y);
    GL11.glNormal3f(t.norm2.x, t.norm2.y, t.norm2.z);
    GL11.glVertex3f( (float)t.p2.pos.x, (float)t.p2.pos.y, (float)t.p2.pos.z);
    GL11.glTexCoord2f(t.uvw3.x, t.uvw3.y);
    GL11.glNormal3f(t.norm3.x, t.norm3.y, t.norm3.z);
    GL11.glVertex3f( (float)t.p3.pos.x, (float)t.p3.pos.y, (float)t.p3.pos.z);
    GL11.glEnd();
}
如您所见,我有一个每次单击鼠标时都会调用的选择功能,然后我禁用照明和纹理,然后以独特的颜色再次渲染场景,然后读取像素缓冲区,然后调用: GL11.glReadPixels(x, y, 1, 1, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, pixelbuff); 给了我错误的价值观..它让我发疯!顺便说一句,主要的渲染函数是render(mesh m, boolean inPickingMode),你可以看到,你也可以看到鼠标点击之前模型上有纹理..