Я пытался реализовать выбор цвета, и это просто не работает. проблема в том, что если сначала нарисовать мою модель в разных цветах, которые используются для выбора (я имею в виду, я даю каждому треугольнику другой цвет, который является его цветом), он отлично работает (без текстуры или чего-то еще), но если я положил текстуру модели, и что при щелчке мыши я окрасить модель, давая каждый треугольник в другой цвет, он не работает .. вот код:Выбор цвета в openGL
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 т, 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); дает мне неправильные значения .. и его вождение меня nutz! btw, основная функция рендеринга визуализируется (mesh m, boolean inPickingMode), как вы можете видеть, вы также можете увидеть, что текстура на модели перед щелчком мыши.
Прежде всего, спасибо за ответ, я действительно его утвержу. – gal